如何将主键值分配给外键?

时间:2014-05-08 09:07:37

标签: sql sql-server database

我不认为我可以在标题中具体说明我的问题。让我这样说吧,远离谈论项目的内容。

我的数据库中有很多表,其中两个是PersonsAddress。需要规范化并在这两个实体之间设置多对多关系,我不会在这些表中保留任何外键相互引用。例如,我不会在“人员表”

中将外键存储到地址表

相反,我的外键位于名为PersonAddress的第三个表中。此表只包含两个引用其自己的表中主键的外键(PersonAddress

在Microsoft SQL Server中,我们将相关表格链接到另外两个表格中,使名为PersonId, AddressId 外键的表格的属性(PersonAddress)成为另一个两个表,允许删除和更新级联操作。 (无论如何)

第一次看起来它会很好用。但是,一旦我们继续将数据输入数据库,就会发现第三个表中的外键值保持不变,我们可以在这两个表中看到每个主键值Person和Address

任何帮助将不胜感激,并提前感谢您的未来尝试,伙计们。

2 个答案:

答案 0 :(得分:3)

你做了正确的事情来创建中间表以创建多对多关系,它似乎按预期工作。

  • SQL Server不会自动删除PersonAddress表中的相关项目,但如果您自己没有这样做,则会失败
  • 我会在另外两个ID上放一个主键 - 将它们都作为FK。

如果没有回答,请澄清问题。

答案 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