我有一个地方 ('place') 可以放置一些盒子 ('box')。在每个盒子里,我都可以有元素('item')。我也可以把元素放在盒子外面的地方。 我想删除一个地方,然后删除这个地方的每个盒子,包括每个盒子里的项目以及这个地方但在任何盒子外面的项目。 我使用以下单独的语句得到了它:
1:选择地点
SELECT placeid, placename
FROM place
WHERE userid = (SELECT id
FROM user
WHERE username = 'username' AND password ='password')
AND placename = 'placename'
2:选中那个地方的方框
SELECT boxid, boxname
FROM box
WHERE placeid = 'id'
3a:对于每个盒子,删除里面的元素
DELETE FROM item
WHERE boxid = 'boxid'
3b: 然后删除框
DELETE FROM box
WHERE id = 'boxid'
4:删除不在盒子里的地方的元素
DELETE FROM item
WHERE placeid = 'placeid' AND boxid = 0
5:删除地方
DELETE FROM place
WHERE id = placeid
这是可行的,但当然速度很慢。错误管理也不是很好用。
有没有一种方法可以用更少甚至只用一个 SQL 语句来完成这一切?
我当然遇到了关于在一个语句中删除一个框的相同问题!
编辑:mysql 与 php
非常感谢。
最佳答案
你应该尝试ON DELETE CASCADE
,它看起来像这样:
ALTER TABLE box ADD CONSTRAINT fk_box_place_id
FOREIGN KEY (placeid)
REFERENCES place(id)
ON DELETE CASCADE;
ALTER TABLE item ADD CONSTRAINT fk_item_place_id
FOREIGN KEY (placeid)
REFERENCES place(id)
ON DELETE CASCADE;
我认为您不需要任何其他级联,因为 placeid
在所有表格中都可用,并且将涵盖盒内和盒外的项目,但也许我忽略了一些东西。
设置完成后,您只需删除要删除的位置,其余的都为您处理:
DELETE
FROM place
WHERE placeID = 'deletedPlaceID';
关于mysql - 多个 MYSQL 语句合二为一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703130/