为什么我的`delete where id in`语句会删除表中的所有记录?

合鹏

我正在使用MySQL 5.7.24版本。我想删除回复表中具有相同ex_id和ex_type的记录:

CREATE TABLE `reply` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `content` varchar(1024) NOT NULL,
  `ex_id` bigint(20) DEFAULT '0',
  `ex_type` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_ex_id_type` (`ex_id`,`ex_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

具有以下数据:

+----+-------------------+-------+---------+
| id | content           | ex_id | ex_type |
+----+-------------------+-------+---------+
|  1 | this is a content |     1 |       1 |
|  2 | this a test       |     2 |       1 |
|  3 | this a contet     |     1 |       1 |
|  4 | the 4th content   |     3 |       1 |
+----+-------------------+-------+---------+

记录1和3共享相同的ex_id和ex_type,我想要删除ID较小的记录(记录1),所以我编写了以下查询:

delete from reply where id in (
    select id from (
        select min(id) from reply group by ex_type and ex_id having count(1) > 1
    ) tmp
)
-- Query OK, 4 rows affected

本应删除一条记录,但所有记录都将被删除。

实际上,此SQL中有一个错误,内部SQLselect min(id) from reply group by ex_type and ex_id having count(1) > 1返回的结果只有一个字段:'min(id)',外部SQLselect id from () tmp选择一个不存在的字段ID,这会导致错误,但是MySQL仍然执行此sql并删除所有记录。

我想知道为什么会这样。

萨尔曼A

...外部sqlselect id from () tmp选择一个不存在的字段ID,这会导致错误,但是mysql执行此sql并删除所有记录。

我想知道为什么会这样。

此子查询将不会单独运行:

select id from (
    select min(id) from reply group by ex_type and ex_id having count(1) > 1
) tmp
/* SQL Error (1054): Unknown column 'id' in 'field list' */

但是,当它在子查询中运行时,则根据范围解析规则,由于FROM子句中不存在所请求的列,因此id列将解析为外部查询的id列查询本质上是这样的:

delete from reply where id in (
    select reply.id from (
        select min(id) from reply group by ex_type and ex_id having count(1) > 1
    ) tmp
)
/* Affected rows: 4  Found rows: 0  Warnings: 0  Duration for 1 query: 0.031 sec. */

因为1 IN(1),2 IN(2),3 IN(3)...都为真,所以该条件对于所有行都是真。解决拼写错误(group by ex_type and ex_id)无法解决问题,请将查询更改为此:

delete from reply where id in (
    select tmp.id from (
        select min(id) as id from reply group by ex_type, ex_id having count(1) > 1
    ) tmp
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们使用SKU,因为我们拥有唯一的ID

来自分类Dev

为什么不能在SQL Server的CASE语句列上使用filter我的WHERE子句?

来自分类Dev

NPoco:为什么我的Delete <Model>()调用会引发NullReferenceException?

来自分类Dev

为什么MySQL认为我没有使用WHERE语句?

来自分类Dev

使用带有ID序列的where语句

来自分类Dev

无法更新行,只能插入到我的MySQL表中。语法错误“ WHERE ID = 0”

来自分类Dev

为什么SELECT ... WHERE id = a如果值是0则返回结果

来自分类Dev

为什么我的NavController无法找到我已经拥有的ID?

来自分类Dev

为什么使用不安全的查询:Delete语句不带任何位置会清除表中的所有数据?

来自分类Dev

为什么我的graphQL查询返回没有“ where”过滤器的结果?

来自分类Dev

为什么$ id我的项目在codeigniter中的值是NULL

来自分类Dev

为什么“ LINQ表达式'x'无法翻译”?我没有使用“ Where()”

来自分类Dev

为什么此BigQuery WHERE NOT IN语句没有给出结果?

来自分类Dev

从导轨中的某个ID删除所有记录?

来自分类Dev

为什么“ WHERE text!=” something”也会排除所有具有NULL值的行?

来自分类Dev

为什么我不能在WHERE语句中使用变量?

来自分类Dev

当我两次包含where子句时,为什么带有嵌套选择的查询会更快

来自分类Dev

为什么我不能从该表中删除记录?

来自分类Dev

谁能告诉我为什么这个where子句没有给我结果?

来自分类Dev

什么是我的vugen CodeGenerationLog.txt中的“用ID替换事件以进行ID交易”,为什么我要> 8个

来自分类Dev

为什么我的SQL语句在WHERE子句中显示未知列

来自分类Dev

我的SqlDataSource中的WHERE语句导致无效字符异常(ORA-00911),为什么?

来自分类Dev

无法更新行,只能插入到我的MySQL表中。语法错误“ WHERE ID = 0”

来自分类Dev

从表中删除所有记录,但最近N个月的记录除外(按ID排序)

来自分类Dev

为什么我的SQL表维护已删除的ID?

来自分类Dev

MySQL查询会删除A表中未在B表中找到ID的所有行吗?

来自分类Dev

为什么选择查询中where子句自动递增ID匹配“ true”的查询返回第一行?

来自分类Dev

为什么我的 id 没有从我的 url PHP AJAX MYSQL 中获取

来自分类Dev

为什么我总是收到有关 where 条件的提示?

Related 相关文章

  1. 1

    为什么我们使用SKU,因为我们拥有唯一的ID

  2. 2

    为什么不能在SQL Server的CASE语句列上使用filter我的WHERE子句?

  3. 3

    NPoco:为什么我的Delete <Model>()调用会引发NullReferenceException?

  4. 4

    为什么MySQL认为我没有使用WHERE语句?

  5. 5

    使用带有ID序列的where语句

  6. 6

    无法更新行,只能插入到我的MySQL表中。语法错误“ WHERE ID = 0”

  7. 7

    为什么SELECT ... WHERE id = a如果值是0则返回结果

  8. 8

    为什么我的NavController无法找到我已经拥有的ID?

  9. 9

    为什么使用不安全的查询:Delete语句不带任何位置会清除表中的所有数据?

  10. 10

    为什么我的graphQL查询返回没有“ where”过滤器的结果?

  11. 11

    为什么$ id我的项目在codeigniter中的值是NULL

  12. 12

    为什么“ LINQ表达式'x'无法翻译”?我没有使用“ Where()”

  13. 13

    为什么此BigQuery WHERE NOT IN语句没有给出结果?

  14. 14

    从导轨中的某个ID删除所有记录?

  15. 15

    为什么“ WHERE text!=” something”也会排除所有具有NULL值的行?

  16. 16

    为什么我不能在WHERE语句中使用变量?

  17. 17

    当我两次包含where子句时,为什么带有嵌套选择的查询会更快

  18. 18

    为什么我不能从该表中删除记录?

  19. 19

    谁能告诉我为什么这个where子句没有给我结果?

  20. 20

    什么是我的vugen CodeGenerationLog.txt中的“用ID替换事件以进行ID交易”,为什么我要> 8个

  21. 21

    为什么我的SQL语句在WHERE子句中显示未知列

  22. 22

    我的SqlDataSource中的WHERE语句导致无效字符异常(ORA-00911),为什么?

  23. 23

    无法更新行,只能插入到我的MySQL表中。语法错误“ WHERE ID = 0”

  24. 24

    从表中删除所有记录,但最近N个月的记录除外(按ID排序)

  25. 25

    为什么我的SQL表维护已删除的ID?

  26. 26

    MySQL查询会删除A表中未在B表中找到ID的所有行吗?

  27. 27

    为什么选择查询中where子句自动递增ID匹配“ true”的查询返回第一行?

  28. 28

    为什么我的 id 没有从我的 url PHP AJAX MYSQL 中获取

  29. 29

    为什么我总是收到有关 where 条件的提示?

热门标签

归档