每当我在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)
谁能告诉我这里发生了什么?这是一个错误还是我错过的设置?
答案 0 :(得分:3)
我自己找到了答案。
我的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()
函数时的值相同。有关详细信息(包括多行插入后的返回值),请参阅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。