0

我的数据库中有 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 查询?

哪一种可能更有效?

4

4 回答 4

2

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

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

于 2013-05-03T11:38:52.843 回答
1

不可以。您可以创建一个视图来告诉您设备所在的类别,但它是不可更新的。

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
于 2013-05-03T11:36:56.890 回答
1

DELETE 子句允许在一个请求中使用多个表。试用 :

DELETE FROM category1 c1, category2 c2, categorie3 c3 WHERE c1.deviceUDID= :deviceUDID AND c2.deviceUDID= :deviceUDID AND c3.deviceUDID= :deviceUDID ...
于 2013-05-03T11:37:45.160 回答
0

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

于 2013-05-03T11:34:17.813 回答