我有两个表(父表,子表(。
表格包含的数据如下
测试(儿童( 类型版本 -------- ------- 宝马M3 奥迪RS6 奔驰S500 奥迪RS4 宝马M3 奥迪RS6 测试2(父级( 类型版本(类型和版本是组合的唯一键( -------- ------- 奥迪RS4 奥迪RS6 奔驰S500 宝马 M3
这两个表通过外键(类型、版本(和测试时 test2 级联的更新链接。这完美无缺。
但是,我希望能够将test2中的版本更改为test2中的相同版本(见下文(。由于类型/版本是组合的唯一键,我确实会收到重复键警告,这是逻辑。有没有一种聪明的方法可以保持这个概念?我可以使用正常的SQL更新等来做到这一点,但想尝试使用外键。
结果应如下所示。将 RS6 的父值更改为 RS4
测试(儿童( 类型版本 -------- ------- 宝马M3 奥迪RS4 奔驰S500 奥迪RS4 宝马M3 奥迪RS4 测试2(父级( 类型版本 -------- ------- 奥迪RS4 奔驰S500 宝马M3
您可以通过两个查询来执行此操作:
-
首先在子表中将奥迪RS4的版本更改为RS6(这将起作用,因为父表已经存在(
-
然后删除父奥迪RS6(这不会影响子表,因为不再有子表与该父表相关(
查询:
update test set version = 'RS4' where type = 'audi' and version = 'RS6';
delete from test2 where type = 'audi' and version = 'RS6';
是:
UPDATE test SET type = 'audi', version = 'RS4'
WHERE type = 'audi' AND version = 'RS6';
它甚至可以像这样工作,因为您只更改其中一列:
UPDATE test SET version = 'RS4'
WHERE type = 'audi' AND version = 'RS6';
只要子表中的两列引用 UPDATE 前后父表中存在的行,就可以了。
重新发表您的评论:
不,没有办法一步完成您描述的操作。
您必须这样做:
更改
test
中依赖于要合并的父行的任何行。UPDATE test SET type = 'audi', version = 'RS4' WHERE type = 'audi' AND version = 'RS6';
删除父行,之后没有依赖于它的子行。
DELETE test2 WHERE type = 'audi' AND version = 'RS6';