MySQL使用NULL删除问题

时间:2014-01-30 13:02:34

标签: 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 ;

然后执行以下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会受到这种行为的影响?或者这是配置问题吗?

1 个答案:

答案 0 :(得分:8)

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

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,但那个人同样没有意识到这个功能。