我试图创建一个具有一对多关系的表。但似乎在Personal中添加外键不起作用。我想将个人信息表链接到地址表?这个错误的解决方案是什么?
Address
表已成功保存Personal
表无法创建关系'FK_Personal_Address' 无法在其中创建级联外键'FK_Personal_Address' 引用列'Personal.ID'是一个标识列。不能 创建约束。查看以前的错误。
答案 0 :(得分:5)
Person表中的主键可能是一个标识。这是一个自动递增的整数字段。
您需要在int类型的地址表中创建外键,而不是identity。它将保存与Person记录对应的整数,但您不希望外键自动递增。对于子表(地址)中的每个记录,您将为外键设置一个特定值,指示它所属的父记录(Person)。
示例:
INSERT person (firstname, lastname) VALUES ('John', 'Smith')
这将插入新的人员记录,字段personid
将自动填充,因为它是一个IDENTITY字段。
现在要从John Smith插入地址,您需要知道他的personid
。例如:
-- Say, for example, personid of John Smith is 55
INSERT address (personid, street, city) VALUES (55, 'High Street', 'London')
因此,在person
表中,personid会自动生成,但在address
表中,您可以指定与现有人匹配的值。这就是外键的重点。
如果没有关于您的架构的更多信息,很难猜到这个问题。
答案 1 :(得分:2)
我确保遵循上面回答中讨论的identity,int和primary key。但是,我仍然得到同样的错误。
'xReason' table saved successfully
'xAddress' table
- Unable to create relationship 'FK_xAddress_xReason'.
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_xAddress_xReason". The conflict occurred in database "databaseName", table "dbo.xReason", column 'xReasonID'.
当我将一些数据插入Reason table.
(具有主键的表)时,此错误已解决
如果你读到这里,这可能是你的问题。
答案 2 :(得分:1)
如果没有看到问题中表格的结构,我认为最可能的原因是子表(地址)中的列被标记为标识列。在外键关系中,父级确定字段的值,而不是子级。该列可以是子表中的PK,但不是标识。
答案 3 :(得分:1)
您似乎尝试在与自身相关的Personal.ID上创建外键。
你可能想做类似的事情:
ALTER TABLE Adress WITH NOCHECK ADD CONSTRAINT [FK_Adress_Personnal] FOREIGN KEY(Personal_Id)
REFERENCES Personal (ID)
答案 4 :(得分:-1)
我在其中一个表中添加外键约束时遇到了同样的错误。 我发现解决方法是使用NOCHECK添加它。为什么我能用CHECK添加另外两个外键但不能添加第三个外键?我发现它不是表,而是要添加的外键的顺序。对此有任何见解将非常感激。