外键约束阻止插入

Posted

技术标签:

【中文标题】外键约束阻止插入【英文标题】:Foreign key constraint prevents insert 【发布时间】:2021-12-09 14:17:38 【问题描述】:

我想建立一个表,添加外键,然后将数据添加到表中,但不允许我这样做。

我的两个测试表如下

CREATE TABLE tesa 
(
    company_id INT UNIQUE,
    first_name VARCHAR(20),
    last_name VARCHAR(20)
)

CREATE TABLE testb 
(
    company_id INT UNIQUE,
    company_code VARCHAR(3),
    policy_no INT
)

测试表的第一个条目

tesa (1, dan, fitz) 
testb (1, abc, 2) 

这些是通过 SQL Server Management Studio 的“编辑前 200 行”命令输入的。他们被很好地接受了。

然后我使用

添加了外键
ALTER TABLE tesa 
ADD CONSTRAINT FK_tesa_testb_id 
        FOREIGN KEY (company_id) REFERENCES testb (company_id)  

这也被接受了。

我遇到的问题是,当我添加外键然后尝试添加其他条目时,即使清除并重新输入已接受的两个条目,我也会收到一条错误消息,指出外键约束存在问题。我在另一个系统上试过这个,它可以接受所有的信息,不知道这个问题会是什么。

【问题讨论】:

请逐字显示错误信息。 您好 Dale,谢谢您道歉,我认为错误的屏幕截图已与问题一起上传 我们不想要屏幕截图...只是测试...逐字逐句。 再次感谢 【参考方案1】:

外键到位后,您必须确保testb 中存在一个有效company_id 的条目,然后才能将内容插入tesa

所以对于你展示的两个插入,你必须运行

INSERT INTO testb (company_id, company_code, policy_no) 
VALUES (1, 'abc', 2) 

首先,使testb中的条目与company_id = 1存在,然后才能运行:

INSERT INTO tesa (company_id, first_name, last_name)
VALUES (1, 'dan', 'fitz') 

否则,FK 约束将执行其职责并告诉您,如果事先在 testb 中不存在具有相同 company_id 的行,则无法将行插入到 tesa .

另外,请允许我发表一个意见:按照现在的设置方式,对于给定的@,您只能tesa 中拥有一个条目 987654332@,因为该值必须是UNIQUE - 这真的是您的意图吗?好像那些是例如公司的客户或员工,您可能希望在tesa 中为任何给定的company_id 提供多个 条目,引用该公司(一对多强>关系)。只是想知道....

还有一点:您的两个表都没有定义主键——这通常是参照完整性的支柱之一。您当前的设置确实有效,因为 SQL Server 允许一个表引用另一个表中的 唯一约束 - 但您应该真正考虑一下 主键 你的两个表都应该是。

最后:为您的表格使用比tesatestb 更具表现力的名称......testb 最有可能被称为Companytesa ,使用任何有意义的东西 - CustomerEmployeeFan - 无论这些人对他们所连接的公司是什么......

【讨论】:

谢谢我按照顺序将值输入到“testb”然后输入到“tesa”我现在明白为什么会出现问题。我一定会按照您的指示格式化未来的问题,非常感谢您的反馈。

以上是关于外键约束阻止插入的主要内容,如果未能解决你的问题,请参考以下文章

sql。两个间的外键约束和插入数据问题

MySQL插入数据因外键约束失败?

SQLSERVER外键约束

主键约束,外键约束,空值约束,默认值约束,唯一约束,检查约束的各个作用是啥?

如何阻止 Go gorm 在 Postgres 中对我的自引用外键强制非空约束

由于引用同一个表,外键的插入约束