查询IS NULL时,MySQL返回最后一个插入

每当我做一个SELECT语句WHERE id is NULLINSERT后直接WHERE id is NULL ,我得到最后一个插入的行。

我正在使用MySQL 5.1.73。

它直接发生在MySQL shell中; 这里是我的控制台:

mysql> CREATE TABLE testing (
    ->     id int(11) NOT NULL AUTO_INCREMENT,
    ->     name VARCHAR(200),
    ->     PRIMARY KEY (id)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO testing (name) VALUES ('test');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM testing WHERE id IS NULL;
+----+------+
| id | name |
+----+------+
|  1 | test |
+----+------+
1 row in set (0.01 sec)

谁能告诉我这里发生了什么? 这是一个错误还是我错过了一个设置?


我自己找到了答案。 我的MySQL版本(5.1.73,CentOS 6上的最新版本)默认情况下设置为sql_auto_is_null ,而较新版本则不会:

╔═════════════════════════════╦══════════════════╦══════════════════╗
║ System Variable (<= 5.5.2)Name             ║ sql_auto_is_null ║
║                             ║ Variable Scope   ║ Session          ║
║                             ║ Dynamic Variable ║ Yes              ║
╠═════════════════════════════╬══════════════════╬══════════════════╣
║ System Variable (>= 5.5.3)Name             ║ sql_auto_is_null ║
║                             ║ Variable Scope   ║ Global, Session  ║
║                             ║ Dynamic Variable ║ Yes              ║
╠═════════════════════════════╬══════════════════╬══════════════════╣
║ Permitted Values (<= 5.5.2) ║ Type             ║ boolean          ║
║                             ║ Default          ║ 1                ║
╠═════════════════════════════╬══════════════════╬══════════════════╣
║ Permitted Values (>= 5.5.3) ║ Type             ║ boolean          ║
║                             ║ Default          ║ 0                ║
╚═════════════════════════════╩══════════════════╩══════════════════╝

如果此变量设置为1(默认值),则在成功插入自动生成的AUTO_INCREMENT值的语句后,可以通过发出以下格式的语句来找到该值:

SELECT * FROM tbl_name WHERE auto_col IS NULL

如果语句返回一行,则返回的值与调用LAST_INSERT_ID()函数时相同。 有关详细信息(包括多行插入后的返回值),请参见第12.14节“信息函数”。 如果未成功插入AUTO_INCREMENT值,则SELECT语句不返回任何行。

某些ODBC程序(如Access)使用通过使用IS NULL比较来检索AUTO_INCREMENT值的行为。 请参阅获取自动增量值。 此行为可以通过将sql_auto_is_null设置为0来禁用。

从MySQL 5.5.3开始, sql_auto_is_null的默认值是0,早期版本的默认值是1。

链接地址: http://www.djcxy.com/p/28857.html

上一篇: MySQL returns last inserted when querying IS NULL

下一篇: Packaging and Running Scala Spark Project with Maven