查询IS NULL时,MySQL返回最后一个插入
每当我做一个SELECT
语句WHERE id is NULL
在INSERT
后直接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。