SQL Server外键:如果我们要合并多个值

时间:2017-02-11 15:02:58

标签: sql-server

美好的一天,

我们假设我们有一个父表,其列为:

[1] id, int, Identity, Primary
[2] name, nvarchar, unique

还有一张儿童桌:

[1] parent, nvarchar, FK reference [parent].[name], ON UPDATE CASACADE
[2..] other columns

如果我们现在在父表中有多个条目,例如

,该怎么办?
| id | name  |
| 0  | test1 |
| 1  | test2 |
| 2  | test3 |

并且所有这些都在[child]表中引用了行。 如果我们想要"合并" test1到test3 ..(即没有更多的test1和引用test1的所有行都应该成为test3),但[parent]。[name]是唯一的......有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我不确定你为什么选择使用name作为外键,这样做会失去在父表上使用id的好处。

如果我理解正确:您要做的是将引用'test1'的所有子行移动到'test3'并一起删除'test1'

对于此示例,我使用c作为[2]p作为[1]

update c set parent='test3' where parent = 'test1';
delete from p where name='test1';

答案 1 :(得分:1)

以上两位受访者都提到了您的PK / FK关系,我非常同意。最好将主列表中的ID列设置为PK,并将FK设置为​​等于PK ID值。

您的主表看起来很好,它是有问题的FK参考。我会将子表(如提供的那样)更改为:

[1] parentid, int, FK reference [parent].[id], ON UPDATE CASACADE

主要问题的答案是更新外表以引用新的PK,它与级联选项无关,但它将更改与外部表行关联的PK唯一名称。在进行外键更改后,您可以运行以下两个t-sql语句。

UPDATE Child
SET parentid = 2
WHERE parented = 0

DELETE
FROM Parent
WHERE ID = 0