【问题标题】:Updating parent key should change child key (foreign key)更新父键应该改变子键(外键)
【发布时间】:2020-01-26 15:58:17
【问题描述】:

我有两个表(父、子)。

表格包含如下数据

测试(儿童) 类型版本 -------- -------- 宝马M3 奥迪RS6 奔驰S500 奥迪RS4 宝马M3 奥迪RS6 测试2(父) 类型版本(类型和版本是组合的唯一键) -------- -------- 奥迪RS4 奥迪RS6 奔驰S500 宝马M3 外键 更改表测试 添加约束 fk_test 外键(版本)参考 test2(版本);

我可以将数据添加到“子”表中,该表使用“子”表上的 BEFORE INSERT TRIGGER 在“父”表中创建一个唯一条目。 (INSERT INTO parent ... ON DUPLICATE KEY...)

我想要做的是通过更新父表(仅版本列),子表中的所有相应条目也应该更新。

例如通过将“父”表中的 RS6 更改为 RS5,我想在子表中看到以下更改。

类型版本 -------- -------- 宝马M3 奥迪RS5 奔驰S500 奥迪RS4 宝马M3 奥迪RS5

但如果我更新父表中的“版本”字段,我会收到此错误。

#1452 - 无法添加或更新子行:外键约束失败 (`table`.`test`, CONSTRAINT `fk_test` FOREIGN KEY (`version`) REFERENCES `test2` (`version`) ON UPDATE级联)

我什至在子表中添加了一个 BEFORE UPDATE 触发器(与插入之前相同)

我想我做错了,但是有没有办法用外键或类似的解决方案来做到这一点?

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

    您不必编写触发器来执行您描述的操作。

    您可以通过将其操作设置为ON UPDATE CASCADE 来使用外键执行此操作,这意味着父项中的更改将复制到子项中。

    alter table test add foreign key (type, version) 
      references test2(type, version) 
      on update cascade;
    

    此更新与对父级的更新同时发生。

    更多信息请阅读:https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html#foreign-key-referential-actions

    【讨论】:

    • 在您发布之前我确实尝试了 on cascade,起初似乎不起作用。然后我再次设置它,它现在工作得很好。感谢您的评论,这让我回到了这一点。但是,拍摄您发布的 sql 以某种方式删除了我的表(不是我太在意),但它似乎在数据库中丢失了。因为如果我尝试使用相同的名称再次创建一个表,我会收到外键警告,尽管没有键存在。你知道怎么清理吗?
    • 听起来您创建了父表但忘记了主键。
    【解决方案2】:

    我认为你不应该像这样更改主键,你应该为父级添加一个人工键,并使用外键与子级建立关系,然后你可以随意更改父级希望并获取您在查询中加入它的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多