Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将主键值指定给外键?_Sql_Sql Server_Database - Fatal编程技术网

Sql 如何将主键值指定给外键?

Sql 如何将主键值指定给外键?,sql,sql-server,database,Sql,Sql Server,Database,我不认为我可以在标题中具体说明我的问题。让我这样说,不要谈论项目的内容 我的数据库中有许多表,其中两个是Persons和Address。由于需要规范化和设置这两个实体之间的多对多关系,我在这些表中不保留任何外键,它们相互引用。例如,我不将外键存储到地址表、个人表中 相反,我的外键位于第三个名为PersonalAddress的表中。此表只包含两个外键,它们引用各自表中的主键(Person,Address) 在Microsoft SQL Server中,我们将有问题的表链接到其他两个表中,将名为Pe

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

我的数据库中有许多表,其中两个是
Persons
Address
。由于需要规范化和设置这两个实体之间的多对多关系,我在这些表中不保留任何外键,它们相互引用。例如,我不将外键存储到地址表、个人表中

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

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

在第一次,它似乎会工作得很好。然而,一旦我们继续向数据库输入数据,第三个表中的外键值就会保持不变,我们可以在Person和Address表中看到每个主键值


各位,我们将感谢您的任何帮助,并提前感谢您的潜在尝试。

您创建中间表以创建多对多关系是正确的,并且它似乎按照预期工作

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

如果这不能回答问题,请澄清问题。

您创建中间表以创建多对多关系的做法是正确的,并且它似乎按照预期工作

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

如果这不能回答问题,请澄清问题。

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

作为:

由于您已经有了表定义来修改外键约束,我们必须首先删除现有的外键约束,然后使用新定义重新创建它。 因此,写为:

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 

您可以检查测试运行,以反映或级联父表中引用列中所做的更改(即,如果您更改父表主键列中的值),并反映在子表中(即,您希望子表外键列中的entires也用相同的值更新)定义外键时,应添加
Cascade
选项

作为:

由于您已经有了表定义来修改外键约束,我们必须首先删除现有的外键约束,然后使用新定义重新创建它。 因此,写为:

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 

您可以检查测试运行

在定义外键时是否在更新级联上添加了删除级联?您能否澄清正在执行的语句以及您认为应该产生的影响?您在定义外键时是否在更新级联上添加了删除级联?您能否澄清正在执行的语句,你认为会有什么影响?一定要看DeepShikha的答案。。。看起来你可以级联更新和删除。确保你看了DeepShikha的答案。。。您似乎可以级联更新和删除。