奇怪的MySQL行为,看起来像一个SQL错误

奇怪的MySQL行为,看起来像一个SQL错误,mysql,Mysql,我在MySQL中得到了一个非常奇怪的行为,看起来像某种奇怪的bug。我知道一个人的错误归咎于久经考验的工具是很常见的,但我已经讨论了一段时间了 我有两个表,I,2797条记录,C,1429条记录。C参考文献I. 我想删除I中C未使用的所有记录,因此我正在执行以下操作: select * from i where id not in (select id_i from c); 返回0条记录,考虑到每个表中的记录计数,这在物理上是不可能的。我也非常确定这个查询是正确的,因为它是我在过去两个小时里用

我在MySQL中得到了一个非常奇怪的行为,看起来像某种奇怪的bug。我知道一个人的错误归咎于久经考验的工具是很常见的,但我已经讨论了一段时间了

我有两个表,I,2797条记录,C,1429条记录。C参考文献I.
我想删除I中C未使用的所有记录,因此我正在执行以下操作:

select * from i where id not in (select id_i from c);
返回0条记录,考虑到每个表中的记录计数,这在物理上是不可能的。我也非常确定这个查询是正确的,因为它是我在过去两个小时里用来清理其他带有孤立记录的表的同一类型的查询

让事情变得更奇怪

select * from i where id in (select id_i from c);
确实有效,并为我带来了我不想删除的1297条记录。
所以,在工作中,但不是在没有

更糟糕的是:

select * from i where id not in (
  select i.id from i inner join c ON i.id = c.id_i
);
这确实有效,尽管它应该与第一个查询等效(我现在只是在尝试疯狂的东西)。
唉,我不能使用这个查询来删除,因为我使用的是子查询中要从中删除的同一个表

我假设我的数据库中有东西在这一点上被破坏了

如果有必要的话,这些都是MyISAM表,没有任何外键,而且我在我的开发机器和生产服务器中运行了相同的查询,得到了相同的结果,因此无论有什么损坏,都可能在mysqldump/source循环中幸存下来,这听起来非常奇怪

关于可能出现的问题,或者更重要的是,我如何解决这个问题,有什么想法吗

谢谢

Daniel

我猜您有一行包含空值<当存在空值时,中的code>和
不在
的行为方式可能是您无法预料的。从:

为了符合SQL标准,IN不仅在左侧的表达式为NULL时返回NULL,而且在列表中找不到匹配项且列表中的一个表达式为NULL时也返回NULL

NOT NULL
的值仍然是
NULL
,不像您希望的那样为真

下面是一个简化示例中的行为演示:

CREATE TABLE c (id_i INT NULL);
INSERT INTO c (id_i) VALUES
(1),
(2),
(NULL);

CREATE TABLE i (id INT NOT NULL);
INSERT INTO i (id) VALUES
(1),
(2),
(3);

SELECT * FROM i WHERE id NOT IN (SELECT id_i FROM c); -- returns nothing
SELECT * FROM i WHERE id IN (SELECT id_i FROM c);     -- returns 1,2
SELECT * FROM i WHERE id NOT IN (                     -- returns 3
  SELECT i.id FROM i INNER JOIN c ON i.id = c.id_i
);
我想删除I中C未使用的所有记录

值得一提的是,MySQL支持对标准SQL的扩展,用于多表
DELETE
语法,您可以使用它绕过
而不是
谓词和
NULL
和子查询中的特性

DELETE I
FROM I LEFT OUTER JOIN C ON (i.id = c.id_i)
WHERE c.id_i IS NULL;

NB:我没有测试这个,它只是来自记忆。请自己阅读并在一些示例数据上测试它,以确保在实际数据库上使用它之前,它能按预期工作。

如果您尝试此查询,您会得到什么od

select * 
  from i 
 where NOT EXISTS (select id_i 
                     from c
                    where c.id_i = i.id
                  )

哇,我觉得自己非常愚蠢,非常感谢你,非常非常惊讶,在使用SQL的10多年中,我从未发现过这种行为。非常感谢你,先生@Daniel-
不在(…,NULL)
将始终不返回任何内容。要了解为什么会出现这种情况,请参阅此链接