MySQL使用NULL删除问题

Kic*_*art 5 mysql

我们发现了删除记录的问题,这似乎取决于特定版本的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 ;
Run Code Online (Sandbox Code Playgroud)

然后执行以下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;
Run Code Online (Sandbox Code Playgroud)

在5.1.58-log mysql安装中,这将插入7行,然后删除第一个插入的行.在5.6.12-log install上,这将插入7行,不会删除任何行.

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

Wri*_*ken 8

啊哈,这不是一个错误,它是一个功能.

sql_auto_is_null:

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

在> = 5.5.3中,默认值已从1更改为0

它在MySQL的bug数据库中提到过,但那个人同样没有意识到这个功能.