【问题标题】:What's the difference between INNER and LEFT join in DELETE statement?DELETE 语句中的 INNER 和 LEFT 连接有什么区别?
【发布时间】:2023-03-27 00:15:01
【问题描述】:

删除时,我可以通过 LEFT JOIN 删除两个或多个表中的行。

DELETE a, b FROM
table1 a
LEFT JOIN table2 b on (a.id = b.id)
WHERE ...

我也可以INNER JOIN

DELETE a, b FROM
table1 a
INNER JOIN table2 b on (a.id = b.id)
WHERE ...

究竟这两者有什么区别?

那么其他连接呢
delete 语句中使用其他连接类型是否有意义?这些有什么用处?

删除...连接和使用外键有什么区别
如果我使用ON DELETE CASCADE 子句设置外键:

  1. 是否匹配 INNER 或“LEFT”连接(或以上都不匹配)?
  2. 这是否比使用连接“更好”(更快/更安全)?

我正在使用 MySQL,但我也想知道还有哪些其他数据库支持它。

【问题讨论】:

  • 它不是“通用的”。并非所有 DBMS 都允许使用 DELETE 语句进行 JOIN。所以它应该正确地用 mysql 标记
  • @thirsty_horse, PostgreSQL, SQL-server, DB2, Oracle 做。
  • SQL Server 不允许这个多表DELETEDELETE 操作的目标只能是 1 个表。 DELETE a, b ... 将无效。
  • @Martin,谢谢今天学到了新东西...
  • @le dorfier,好的,对此感到惊讶。您碰巧知道哪些数据库支持它?

标签: mysql sql join foreign-key-relationship sql-delete


【解决方案1】:

不同之处在于内部联接不会删除任何未联接的内容。左连接可以删除未连接的内容,具体取决于您的 WHERE 子句中的内容。

【讨论】:

  • 所以只有内部连接会保持参照完整性?
  • @Johan:不。参照完整性取决于声明的完整性约束以及在规则和触发器中实现的约束。除非存在错误,否则任何数据库更新(如 INSERT、UPDATE、DELETE)都不能以违反完整性约束的方式更改行。但众所周知,复杂语句(例如包含外连接的 DELETE 语句)的结果甚至会让经验丰富的 DBA 感到惊讶。很多很多数据库“设计者”都抱着希望和一厢情愿来实现完整性约束。这些都不能很好地扩展。
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 2014-03-11
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多