【问题标题】:How to assign primary key values into foreign keys?如何将主键值分配给外键?
【发布时间】:2014-05-08 09:07:37
【问题描述】:

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

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

相反,我的外键位于名为PersonAddress 的第三个表中。该表只包含两个外键,它们引用各自表中的主键 (Person,Address)

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

第一次,它似乎会很好地工作。但是,当我们不断往数据库中输入数据时,发现第三张表中的外键值保持不变,我们可以看到 Person 和 Address 表中的每个主键值

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

【问题讨论】:

  • 在定义外键时是否添加了 ON DELETE CASCADE ON UPDATE CASCADE?
  • 你能澄清一下你正在执行什么语句,你认为应该是什么效果?

标签: sql sql-server database


【解决方案1】:

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

  • SQL server 不会自动删除 PersonAddress 表中的相关项,但如果你自己没有这样做会失败
  • 我会将主键放在该表上的其他两个 id 上 - 也将它们都保留为 FK。

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

【讨论】:

  • 确保您查看 DeepShikha 的回答……看来您可以级联更新和删除。
【解决方案2】:

要反映或级联在父表的引用列中所做的更改(即,如果您更改父表的主键列中的值),也将反映在子表中(即,您希望子表外键中的整体列也将使用相同的值进行更新)您应该在定义外键时添加Cascade 选项。

作为:

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2017-06-29
    相关资源
    最近更新 更多