mysql - 多个 MYSQL 语句合二为一

标签 mysql sql

我有一个地方 ('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/

相关文章:

php - Laravel 5 分组方式

mysql - 两个 mysql 表列的总和

mysql - 如何在查询中对 GROUP BY 的结果进行分组?

php - 使用特定标准查找最大值并检查同一组是否有更高/更低或任何值

MySQL数据库查询返回空结果

php - MySQL Date_Format 不适用于

php - 解析错误 : syntax error, 意外的 T_IF

sql - 使用 “not exists”的SQL查询不起作用

c++ - Qt Sql INSERT语句无效

c++ - 如何确保 SqLite 中的只读事务?