【问题标题】:MySQL delete issue with NULLMySQL删除NULL问题
【发布时间】:2014-01-30 13:02:34
【问题描述】:

我们发现了删除记录的问题,这似乎与 MySQL 的特定版本有关。但是,我找不到任何提及此问题的信息,无法知道何时修复。

一些代码试图在主键为 NULL 的情况下执行删除(这永远不会发生),代码是从框架生成的。 MySQL 删除了先前插入的行,主键有效且非空。

可以在这里演示问题。

测试表:-

CREATE TABLE IF NOT EXISTS `fred_delete` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `test` varchar(25) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

然后执行下面的sql:-

INSERT INTO fred_delete
(id, test)
VALUES
(NULL, 'a'),
(NULL, 'b'),
(NULL, 'c'),
(NULL, 'd'),
(NULL, 'e'),
(NULL, 'f'),
(NULL, 'g');

DELETE FROM fred_delete WHERE id IS NULL;

SELECT * FROM fred_delete;

在 5.1.58-log mysql install 上,这会插入 7 行,然后删除第一个插入的行。在 5.6.12-log install 上,这会插入 7 行并且不会删除任何行。

有谁知道哪些版本的 MySQL 会受到这种行为的影响?或者这是配置的问题?

【问题讨论】:

  • 我不熟悉这个错误。 id 在错误情况下是否有 NULL 值,还是 WHERE id ID NULL 有问题?这有助于在错误数据库中搜索;)
  • SELECT * FROM fred_delete WHERE id IS NULL 在有问题的系统上会发生什么?
  • @Kickstart:好的,这表明问题特定于DELETE 语句。我一直在搜索错误历史,但我发现很难在其中找到问题,而且还没有出现任何问题。这可能是更广泛的错误的一个小影响;更可能的是直到现在还没有人知道,尽管它已经作为一个更广泛的错误的一部分得到了修复。在这种情况下,几乎不可能找到您正在寻找的信息。 :(
  • 你在另一台机器上试过了,对吧? Works for me
  • @LightnessRacesinOrbit:我将其理解为 not 特定于 DELETE 语句(毕竟,如果第一行未被删除,SELECT .. WHERE id IS NULL 会返回一行)。 I see this bug, perhaps it is related?.

标签: mysql


【解决方案1】:

啊哈,这不是错误,而是功能。

sql_auto_is_null:

如果此变量设置为 1(默认值),则在成功插入自动生成的 AUTO_INCREMENT 值的语句之后,您可以通过发出以下形式的语句来找到该值: SELECT * FROM tbl_name WHERE auto_col IS NULL

default has been changed from 1 to 0 in >= 5.5.3

It is mentioned in MySQL's bug database,但那是和我们一样不知道这个功能的人。

【讨论】:

  • 优秀。非常感谢。
  • (我建议在此答案中链接到错误 44694:即使这不是错误,也就是错误数据库上的帖子,相当于 SO 上的这个问题,我认为这可能有一些价值.)
猜你喜欢
  • 2014-02-12
  • 2011-01-14
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多