【问题标题】:How do I delete a row from one table, when no more rows exist in another当另一个表中没有更多行时,如何从一个表中删除一行
【发布时间】:2014-10-25 01:41:15
【问题描述】:

我想知道检查一个表数据的最佳方法,当没有更多行与 WHERE 子句匹配时,从另一个表中删除一行。

我自己试过了,但是用 6 个查询和嵌套的 if/else 变得太麻烦了,而且它不能把它加满。

我以前从未使用过 SQL 连接,因此示例将帮助我理解响应。

我有一个设备表,有一个带有设备和密码的主表。

上表还有第二个表,其中包含设备的多行,以及一系列序列号。

当第二个表不再包含主表中列出的任何序列号时,我想要包含主表中的设备和密码的行。

【问题讨论】:

  • 我回家后会发布示例代码,现在它在澳大利亚的家乡时间,所以稍后会起来。
  • 最多只需要 2 个查询。第一次检查表a中是否存在数据,返回结果,如果为空则删除该行。简单的程序。
  • 您能否将一些示例数据与您的预期结果一起包含在内,以便于理解?
  • 预期结果是当从第二个表中删除序列号时,它会检查其最后一行是否已删除(并且该设备不再存在)。如果该设备的最后一行被删除,则它会从主表中删除相应的设备行。
  • 您可以使用外键和 ON DELETE CASCADE 选项重新设计数据库架构,然后从一个表中删除将自动从所有链接表中删除相关记录

标签: php mysql delete-row


【解决方案1】:

如果您的意思是当您有餐桌客户和餐桌订单时,如果客户没有订单,请删除他们?然后你可以使用子选择:

delete from customer where customerid not in (select customerid from order)

【讨论】:

  • 好的,我不知道存在这样的查询,但它可以完美运行。会不会像“从主 WHERE 设备中删除(SELECT device FROM serialtable WHERE device='abcd1234')
  • 实际上,我刚刚在开车回家时意识到,如果我将 where 子句添加到该选择中,它很可能会从主表中删除所有内容...哎呀。
  • 嗯,是的,小心不要犯一个可怕的错误,但你可以先用相同的 where 子句进行选择来测试它
  • 我对其进行了测试(我仍在大量开发和清空这些表),它按预期完美运行。感谢您的帮助,它将我所拥有的(大约 30 行嵌套的 if 语句)减少到 2 行(PDO MySQL 查询)。
【解决方案2】:

你可以像这样写一个 DELETE 语句

DELETE FROM masterTable WHERE ID NOT IN (SELECT masterTableID FROM secondaryTable)

这将删除主表中在第二个表中没有任何引用的所有行。这也意味着它不会只删除一行,而是所有匹配的行。您唯一需要的是第二个表中的每一行都引用主表。

【讨论】:

  • 感谢您的回答与上面的 Jeroen 相同,并且可以按预期完美运行。
  • 很高兴我能帮上点忙 :-)
【解决方案3】:
DELETE table_devices
FROM table_devices
left JOIN serial ON table_devices.id= serial.device_id
WHERE serial.device_id is null

【讨论】:

  • 这与前两个答案读起来类似,它的理智(编码理智)是否比其他答案更好?
  • 我刚刚写了一个替代方法。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 2012-09-10
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多