【问题标题】:Can i delete an entry on multiple tables in one SQL query?我可以在一个 SQL 查询中删除多个表上的条目吗?
【发布时间】:2013-05-03 11:28:16
【问题描述】:

我的数据库中有 5 个表:Category1、Category2、Category3、Category4、Category5

我有一个用户可能会或可能不会在这些表中找到。如果他被发现了,我想把他从桌子上删除。

我可以通过 5 个这样的查询来做到这一点:

//search if the user is already subscribed in every one of the categories 
$stmt = $db->prepare("Select * FROM category1 WHERE deviceUDID = :deviceUDID"); 
$stmt->execute(array(':deviceUDID' => $deviceUDID));

if($rows_found = $stmt ->rowCount()) {    
  $stmt = $db -> prepare("DELETE FROM category1 WHERE deviceUDID =:deviceUDID");    
  $stmt->execute(array(':deviceUDID' => $deviceUDID));
}

那么对于category2:

//search if the user is already subscribed in every one of the categories 
$stmt = $db->prepare("Select * FROM category2 WHERE deviceUDID = :deviceUDID"); 
$stmt->execute(array(':deviceUDID' => $deviceUDID));

if($rows_found = $stmt ->rowCount()) {    
  $stmt = $db -> prepare("DELETE FROM category1 WHERE deviceUDID =:deviceUDID");    
  $stmt->execute(array(':deviceUDID' => $deviceUDID));
}

其他类别依此类推..

是否可以使用 1 个查询来搜索所有这些类别以使其更快?

但我看不出这样的事情发生的逻辑。有什么想法吗?

编辑(奖金部分)


即使用户不在那里并且让查询失败,每次只进行 DELETE 查询会更容易、更快或更有效吗?

或者我应该首先检查每个表,如果找到则进行 DELETE 查询?

哪个更有效?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    如果您担心原子性,将 5 个删除操作包含在事务中即可。

    另外,mysql 现在应该支持外键和级联删除,因此如果您与“用户”表建立外键关系,您可能无事可做。

    【讨论】:

    • 我认为这正是我想做的。但我不确定“外来”键将如何工作。您能否通过一个简单的示例为我提供更多信息?正如您所说,有一张带有 users 的表,所有用户都在其中。然后是 5 个订阅表,用户可能是也可能不是。如果我想让他出去。
    • 我更愿意将您推向正确的方向,以加快您的学习过程。这看起来是一个很好的起点,甚至还有一个 mysql 示例:stackoverflow.com/questions/757181/…
    • +1 用于调出外键。多表删除很好,但基本目标是“与该用户一起删除东西”,所以 FK 是。
    【解决方案2】:

    DELETE clause 在一个请求中允许多个表。 试试看:

    DELETE FROM category1 c1, category2 c2, categorie3 c3 WHERE c1.deviceUDID= :deviceUDID AND c2.deviceUDID= :deviceUDID AND c3.deviceUDID= :deviceUDID ...
    

    【讨论】:

    • 是的,但我想删除,!如果!用户已订阅。在您的示例中,您假设用户实际上在那里!如果他不是呢?
    • 那么您的删除操作将影响 0 行,这对于 SQL 服务器来说不是错误,除非明确指定。
    • 嗯所以你说的是总是尝试删除而不检查用户是否在那里?这是一个很好的技术吗?即使失败了,进行 5 次 DELETES 是否比搜索 5 个表并 IF 找到 DELETE 更有效?
    • 是的,它比进行 5 DELETE 查询要快一点。但是在 MULTIPLE DELETE 中,只有在每个列中都有对应的行时它才有效。您可以在 PHP 中使用 for 循环创建 5 个 DELETE 查询,但您不需要检查这些行之前是否存在。如果不存在具有此 deviceUDID 的行,则 DELETE 不会执行任何操作。
    • 它不会“失败”,它会影响 0 行,这很好。
    【解决方案3】:

    没有。您可以创建一个视图来告诉您设备存在于哪些类别中,但它是不可更新的。

    create view allCategories as
     select 1 as category, *
     from   category1
     union
     select 2 as category, *
     from   category2
     union
     select 3 as category, *
     from   category3
     union
     select 4 as category, *
     from   category4
     union
     select 5 as category, *
     from   category5
    

    【讨论】:

    • Paul 这究竟会给我带来什么?你可以给我一个例子吗?我认为这与@Marcassin 的回答可能会奏效。
    • 我会选择@Marcassin 的答案,我不知道您可以使用 mySql 执行多个表删除。
    • 但是 paul 如果用户不在表中,让 DELETE 查询失败是否有效?它以编程方式正确吗?我是 php/mysql 的新手,我正在努力提高效率。
    • 这取决于表有多大,但我想单个查询会比五个单独的查询更快。您还可以获得一些性能,因为您也不需要五个 select 查询。
    【解决方案4】:

    DELETE FROM category1 WHERE deviceUDID in (Select * FROM category2 WHERE deviceUDID = :deviceUDID) 就是你要找的。​​p>

    【讨论】:

    • 有 5 个类别,你能修正一下答案吗?你能解释为什么它会起作用吗? if($rows_found = $stmt ->rowCount()) 它将如何正常工作?这是我的主要问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    相关资源
    最近更新 更多