查询IS NULL时,MySQL返回最后插入的内容

时间:2015-09-04 09:37:29

标签: mysql select insert null auto-increment

每当我在SELECT之后直接使用WHERE id is NULL发表INSERT语句时,我会获得最后一行。

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

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

1 个答案:

答案 0 :(得分:3)

我自己找到了答案。 我的MySQL版本(5.1.73,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(默认值),则在成功插入自动生成的AUTO_INCREMENT值的语句之后,您可以通过发出以下格式的语句来查找该值:

SELECT * FROM tbl_name WHERE auto_col IS NULL
     

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

     

某些ODBC程序(如Access)使用AUTO_INCREMENT比较检索String seperator = "|"; StringBuilder sb = new StringBuilder(); Set<String> keys = detailHashtable.keySet(); for(String key: keys) { sb.append(key+"="+detailHashtable.get(key)+ seperator); } return sb.toString(); 值的行为。见IS NULL。将Obtaining Auto-Increment Values设置为0可以禁用此行为。

     

从MySQL 5.5.3起,sql_auto_is_null的默认值为0,对于早期版本,默认值为1。