我不认为我可以在标题中具体说明我的问题。让我这样说吧,远离谈论项目的内容。
我的数据库中有很多表,其中两个是Persons
和Address
。需要规范化并在这两个实体之间设置多对多关系,我不会在这些表中保留任何外键相互引用。例如,我不会在“人员表”
相反,我的外键位于名为PersonAddress
的第三个表中。此表只包含两个引用其自己的表中主键的外键(Person
,Address
)
在Microsoft SQL Server中,我们将相关表格链接到另外两个表格中,使名为PersonId, AddressId
外键的表格的属性(PersonAddress
)成为另一个两个表,允许删除和更新级联操作。 (无论如何)
第一次看起来它会很好用。但是,一旦我们继续将数据输入数据库,就会发现第三个表中的外键值保持不变,我们可以在这两个表中看到每个主键值Person和Address
任何帮助将不胜感激,并提前感谢您的未来尝试,伙计们。
答案 0 :(得分:3)
你做了正确的事情来创建中间表以创建多对多关系,它似乎按预期工作。
如果没有回答,请澄清问题。
答案 1 :(得分:1)
要反映或级联在父表中引用列中完成的更改(即,如果更改父表的主键列中的值),也要反映在子表中(即,您希望在子表外键中进行输入)列也要使用相同的值进行更新)在定义外键时应添加Cascade
选项。
as:
create table PersonAddress
(
PersonId int
, AddressId int
,CONSTRAINT FK_PersonId Foreign key (PersonId)
references Person(id) ON UPDATE CASCADE ON DELETE CASCADE
,CONSTRAINT FK_AddressId Foreign key (AddressId)
references Address(id) ON UPDATE CASCADE ON DELETE CASCADE
);
由于您已经有了表定义来修改FOREIGN KEY约束,我们必须首先删除现有的FOREIGN KEY约束,然后使用新定义重新创建它。 所以,写为:
IF EXISTS (SELECT * FROM sys.objects
WHERE name = 'FK_PersonId' AND [type] = 'F')
ALTER TABLE PersonAddress
DROP Constraint FK_PersonId
GO
ALTER TABLE PersonAddress
ADD CONSTRAINT [FK_PersonId]
FOREIGN KEY (PersonId) REFERENCES Person(id)
ON DELETE CASCADE ON UPDATE CASCADE
GO
您可以查看测试运行here