外键约束阻止插入
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 允许一个表引用另一个表中的 唯一约束 - 但您应该真正考虑一下 主键 你的两个表都应该是。
最后:请为您的表格使用比tesa
和testb
更具表现力的名称......testb
最有可能被称为Company
和tesa
,使用任何有意义的东西 - Customer
、Employee
、Fan
- 无论这些人对他们所连接的公司是什么......
【讨论】:
谢谢我按照顺序将值输入到“testb”然后输入到“tesa”我现在明白为什么会出现问题。我一定会按照您的指示格式化未来的问题,非常感谢您的反馈。以上是关于外键约束阻止插入的主要内容,如果未能解决你的问题,请参考以下文章
主键约束,外键约束,空值约束,默认值约束,唯一约束,检查约束的各个作用是啥?