我有这个表结构(三个表:image、image_room、room)
image
image_id(PK) | image_name
image_room
image_id(PK) | room_id (PK)
room
room_id(PK) | room_name
在image_room中可以找到所有图像id和房间id。
当我从图像表中删除图像时,我希望删除image_room中具有相同id的行。在image_room 中使用此外键效果良好
columns | reference Table | Foreign Columns | On Delete
image_id | image | image_id | CASCADE
当我删除一个房间时,我想删除image_room AND中具有匹配房间id的行,以及图像表中与我要从image_roon删除的id匹配的所有行。
我在image_room中有一个外键,它可以从image_room-中删除房间
columns | reference Table | Foreign Columns | On Delete
room_id | room | room_id | CASCADE
删除房间时,如何从image_room中具有匹配image_id的图像表中删除行?现在我猜我删除了image_room表中在image表之前的行。
我已经在图像表中测试了这个外键
columns | reference Table | Foreign Columns | On Delete
image_id | image_room | image_id | CASCADE
并得到错误"无法添加或更新子行外键约束失败"。
我可以用On-delete级联来解决这个问题吗?否则,我将使用PHP作为后端。
当我删除一个房间时,我想删除image_room AND中具有匹配房间id的行,以及图像表中与我要从image_roon删除的id匹配的所有行。
[snip]
我可以用On-delete级联来解决这个问题吗?
不,你不能。在"image"表的情况下,将级联从"image"删除到的"image_room"。(从"image"中删除一行,dbms将删除"image_room"中引用该行的所有行。)不可能在其他方向进行级联删除。
您将不得不更改您的设计,或者使用过程代码,要么用MySQL编写触发器,要么用PHP编写应用程序代码。
如果图像名称是唯一的,您可以将图像名称存储在"image_room"中,而不是存储图像id号。完成后,在确保正确更新数据后,您可以删除表"image",并让"room"的单个外键进行所有清理。