是否可以合并唯一键



我有两个表(父表,子表(。

表格包含的数据如下

测试(儿童( 类型版本 --------  ------- 宝马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 前后父表中存在的行,就可以了。


重新发表您的评论:

不,没有办法一步完成您描述的操作。

您必须这样做:

  1. 更改test中依赖于要合并的父行的任何行。

    UPDATE test SET type = 'audi', version = 'RS4'
    WHERE type = 'audi' AND version = 'RS6';
    
  2. 删除父行,之后没有依赖于它的子行。

    DELETE test2 WHERE type = 'audi' AND version = 'RS6';
    

最新更新