2015-09-04 92 views
7

每当我做一个SELECT语句WHERE id is NULL紧跟在INSERT之后时,我得到最后插入的行。查询IS NULL时MySQL返回的最后一个插入

我正在使用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) 

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

+0

在猜测,也许它这样做,因为这是如何实现“最后插入的ID”功能? – Hammerite

+0

我认为问题是'$ query-> closeCursor();' – Saty

+0

@Saty删除closeCursor仍然会导致相同的结果。 – swordbeta

回答

3

我自己找到了答案。 我的MySQL版本(73年5月1日,最后可用在CentOS 6)具有默认设置上sql_auto_is_null,而较新的版本不:

 
╔═════════════════════════════╦══════════════════╦══════════════════╗ 
║ System Variable (<= 5.5.2)Namesql_auto_is_null ║ 
║        ║ Variable Scope ║ Session   ║ 
║        ║ Dynamic Variable ║ Yes    ║ 
╠═════════════════════════════╬══════════════════╬══════════════════╣ 
║ System Variable (>= 5.5.3)Namesql_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

SELECT * FROM tbl_name WHERE auto_col IS NULL

如果语句返回一行,r值:(默认值),然后成功地插入自动生成AUTO_INCREMENT值的语句后,你可以通过发出以下格式的语句,发现价值eturned与调用LAST_INSERT_ID()函数相同。有关详细信息(包括多行插入后的返回值),请参见Section 12.14, “Information Functions”。如果没有成功插入AUTO_INCREMENT值,则SELECT语句不返回任何行。

某些ODBC程序(如Access)使用通过使用IS NULL比较来检索AUTO_INCREMENT值的行为。见Obtaining Auto-Increment Values。通过将sql_auto_is_null设置为0,可以禁用此行为。

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