美好的一天,
我们假设我们有一个父表,其列为:
[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]是唯一的......有什么方法可以解决这个问题吗?
答案 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