多个MYSQL语句在一个

多个MYSQL语句在一个,mysql,sql,Mysql,Sql,我有一个地方可以放一些盒子。在每个框中,我可以有项目(“项目”)。我也可以把物品放在盒子外面。 我想删除一个位置,这样,就可以删除该位置中的每个框,包括每个框中的项目以及该位置中但在任何框外的项目。 我使用以下单独的语句来实现它: SELECT p.placeid INTO #PlacesToDelete FROM place p INNER JOIN [user] u ON p.userid = u.id WHERE u.username = 'username' AND u.[pa

我有一个地方可以放一些盒子。在每个框中,我可以有项目(“项目”)。我也可以把物品放在盒子外面。 我想删除一个位置,这样,就可以删除该位置中的每个框,包括每个框中的项目以及该位置中但在任何框外的项目。 我使用以下单独的语句来实现它:

SELECT p.placeid
INTO #PlacesToDelete
FROM place p 
INNER JOIN [user] u ON p.userid = u.id
WHERE u.username = 'username'
    AND u.[password] = 'password'
    AND p.placename = 'placename'

DELETE i
FROM item i
INNER JOIN #PlacesToDelete ptd ON i.placeid = ptd.placeid

DELETE b
FROM box b
INNER JOIN #PlacesToDelete ptd ON b.placeid = ptd.placeid

DELETE p
FROM place p
INNER JOIN #PlacesToDelete ptd ON p.placeid = ptd.placeid
1:选择地点

SELECT placeid, placename 
FROM place 
WHERE userid = (SELECT id 
                FROM user 
                WHERE username = 'username' AND password ='password') 
  AND placename = 'placename'
DELETE FROM place 
WHERE id = placeid
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:删除该位置

SELECT placeid, placename 
FROM place 
WHERE userid = (SELECT id 
                FROM user 
                WHERE username = 'username' AND password ='password') 
  AND placename = 'placename'
DELETE FROM place 
WHERE id = placeid
这是工作,但当然这是缓慢的。错误管理也不是很好用

有没有一种方法可以用更少的SQL语句,甚至只有一条SQL语句来完成所有这些任务

我在一个声明中删除了一个方框,当然也遇到了同样的问题

编辑:mysql与php


非常感谢。

因为
都有一个placeid(根据您问题中的信息),您可以稍微简化此任务,但您仍然需要3条
删除
语句:

SELECT p.placeid
INTO #PlacesToDelete
FROM place p 
INNER JOIN [user] u ON p.userid = u.id
WHERE u.username = 'username'
    AND u.[password] = 'password'
    AND p.placename = 'placename'

DELETE i
FROM item i
INNER JOIN #PlacesToDelete ptd ON i.placeid = ptd.placeid

DELETE b
FROM box b
INNER JOIN #PlacesToDelete ptd ON b.placeid = ptd.placeid

DELETE p
FROM place p
INNER JOIN #PlacesToDelete ptd ON p.placeid = ptd.placeid
或者,如果这与MySQL有关,您应该能够进一步简化并使用一条语句:

DELETE p, b, i
FROM place p 
INNER JOIN [user] u ON p.userid = u.id
INNER JOIN box b ON b.placeid = p.placeid
INNER JOIN item i ON i.placeid = p.placeid
WHERE u.username = 'username'
    AND u.[password] = 'password'
    AND p.placename = 'placename'
编辑:根据注释
如果项目位于框中,则placeid等于0,因为它属于框而不是位置
,下面是一个更新的查询,它将删除您想要的所有内容:

DELETE i1, i2, b, p
FROM place p 
INNER JOIN [user] u ON p.userid = u.id
INNER JOIN box b ON b.placeid = p.placeid
INNER JOIN item i1 ON i1.placeid = p.placeid
INNER JOIN item i2 ON i2.boxid = b.boxid
WHERE u.username = 'username'
    AND u.[password] = 'password'
    AND p.placename = 'placename'

您应该尝试删除级联,如下所示:

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';

你用的是什么产品?博士后?神谕“SQL”只是一种查询语言,而不是特定数据库产品的名称。您可以将初始选择合并到每个delete语句中,但一次只能从一个表中删除。如果要添加引用完整性,可以删除父记录,并让系统将删除内容级联到子记录,但这可能不会对性能产生太大影响。对于每次删除,删除级联性能的良好参考是一回事,错误管理是另一回事。否?@pm200107如果让系统完成工作,则无需担心太多错误管理问题<代码>在删除级联上完成此操作。谢谢。因为我不熟悉ON-DELETE级联:我首先在MySQL中修改表来设置它。那么一旦表格被修改,在我的脚本中,我只能删除place表格?或者我必须每一次更改一次表吗?我需要删除表位吗?与digital.亚伦提供的解决方案相比(@digital.亚伦,谢谢),哪种解决方案对性能最好?@pm200107您只需要更改一次表。您可能已经为
placeid
设置了FKs,但如果没有,最好还是设置它们。它将阻止将
placeid
s插入到其他表中,除非它们存在于
place
中。然后是的,您只需从
place
中删除
placeid
,系统将自动从
框和
项中删除引用
placeid
的任何行。您应该首先检查我的FKs是否对您有意义,因为您最了解您的系统,但我相信able会做到这一点。@pm200107性能方面,它们可能是相同的。使用级联删除只是从等式中排除了一点用户错误的可能性。谢谢为了“准备就绪”,我在这篇文章中使用了placeid作为主键。实际上,i在place表中有'id'(以及box表中的'id'和'placeid',item表中的'id'和'placeid')。它改变了什么吗(很抱歉这个愚蠢的问题)没问题,@pm200107。如果我的答案对你有用,如果你能将我的答案标记为“已接受”,我将不胜感激。事实上,这个答案不起作用,因为它将取消该地点、该地点的方框和该地点的项目,但不会取消该地点方框内的项目。项目表有一个placeid。当item.placeid与place.placeid匹配时,项的boxid是什么并不重要。当然,但它不会删除框中的项。如果项目位于框中,则placeid等于0,因为它属于框而不是位置。所以这个答案是不完整的