"关于删除级联"有三张桌子。错误无法添加或更新子行

时间:2015-04-07 10:35:43

标签: php mysql database

我有这个表结构(三个表:image,image_room,room)

image
image_id(PK)  |  image_name

image_room
image_id(PK)  |  room_id (PK)

room
room_id(PK)   |  room_name

所有图片ID和房间ID都在image_room中找到。

当我从图像表中删除图像时,我想在image_room中删除具有相同ID的行。这在image_room

中使用此外键可以正常工作
columns   | reference Table  | Foreign Columns | On Delete
image_id  | image            | image_id        | CASCADE

当我删除一个房间时,我想在image_room中删除具有匹配房间ID的行,并且图像表中的所有行都与我从image_room中删除的id匹配。

我在image_room中有这个外键,可以从image_room中删除房间

columns   | reference Table  | Foreign Columns | On Delete
room_id   | room             | room_id         | CASCADE

删除房间时,如何从image_room中的image_id中删除图像表中的行?现在我猜测我在image table之前删除了image_room表中的行。

我已在图像表中使用此外键进行测试

columns   | reference Table  | Foreign Columns | On Delete
image_id  | image_room       | image_id        | CASCADE

得到错误"无法添加或更新子行,外键约束失败"。

我可以用On delete cascade来解决这个问题吗?否则,我使用PHP作为后端。

1 个答案:

答案 0 :(得分:0)

  

当我删除房间时,我想在image_room中删除具有匹配房间ID的行,并且图像表中的所有行都与我从image_room中删除的id匹配。   
[剪断]
  我可以用On delete cascade来解决这个问题吗?

不,你不能。对于“图像”表,删除级联“图像”“image_room”。 (从“image”中删除一行,dbms删除引用该行的“image_room”中的所有行。)无法在另一个方向级联删除。

您必须通过在MySQL中编写触发器或在PHP中编写应用程序代码来更改设计或使用过程代码。

如果图像名称是唯一的,则可以将图像名称存储在“image_room”中,而不是存储图像ID号。完成后,确保您已正确更新数据后,您可以删除表“image”,让单个外键到“room”进行所有清理。