我想建立一个表,添加外键,然后将数据添加到表中,但它不允许我这样做。
我的两个测试表如下
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)
这也被接受了。
我遇到的问题是,当我添加外键,然后尝试添加其他条目,甚至清除并重新输入已接受的两个条目时,我得到一个错误消息,说外键约束有问题。我在另一个系统上尝试了这个,它可以接受所有的信息,不确定这个问题是什么。
有了外键,您知道必须确保在tesa
中插入一些内容之前,testb
中的条目与有效的company_id
存在。
对于刚才展示的两个插入,必须运行
INSERT INTO testb (company_id, company_code, policy_no)
VALUES (1, 'abc', 2)
首先,以便存在company_id = 1
中的testb
条目,然后才能运行以下命令:
INSERT INTO tesa (company_id, first_name, last_name)
VALUES (1, 'dan', 'fitz')
否则,FK约束将履行其职责并告诉你,如果testb
中不存在具有相同company_id
的行,则不能将行插入tesa
。
同时,请允许我发表一个观察意见:现在设置的方式,您可以只能是否有一个条目在tesa
为给定的company_id
,因为该值必须是UNIQUE
-这真的是你的意图吗?似乎如果这些是公司的客户或员工,您可能希望在tesa
中为任何给定的company_id
拥有多个条目,引用一个公司(一对多)。关系)。只是想知道....
还有一点:两个表都没有定义主键-这是典型的参考完整性的支柱之一。您当前的设置工作,因为SQL Server允许允许表引用唯一约束在另一个表中—但是您应该真正考虑主键
最后:请为表....使用比tesa
和testb
更具表现力的名称testb
很可能被称为Company
,而tesa
,使用任何有意义的-Customer
,Employee
,Fan
-无论这些人是他们所连接的公司.....