MySQL 在查询 IS NULL 时返回最后插入
Posted
技术标签:
【中文标题】MySQL 在查询 IS NULL 时返回最后插入【英文标题】:MySQL returns last inserted when querying IS NULL 【发布时间】:2015-11-30 10:01:03 【问题描述】:每当我在 INSERT
之后直接使用 WHERE id is NULL
执行 SELECT
语句时,我都会得到最后插入的行。
我使用的是 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)
谁能告诉我这里发生了什么?这是一个错误还是我缺少的设置?
【问题讨论】:
猜测,可能是因为“最后插入的 ID”功能就是这样实现的? 我认为问题出在$query->closeCursor();
@Saty 删除 closeCursor 仍然会产生相同的结果。
swordbeta 对我的“未回答”的评论包含:“使用相同的 php 版本 (5.4.16) 但不同的 MySQL 版本(最新的 MariaDB 版本)并且无法重现此错误。”
我无法在 5.5.43 的 MySQL shell 中重现它。
【参考方案1】:
我自己找到了答案。
我的 MySQL 版本(5.1.73,CentOS 6 上的最后一个版本)默认设置为 sql_auto_is_null
,而较新的版本没有:
╔═════════════════════════════╦══════════════════╦ ══════════════════╗ ║ 系统变量 ( ║ 名称 ║ sql_auto_is_null ║ ║ ║ 变量范围 ║ 会话 ║ ║ ║ 动态变量 ║ 是 ║ ╠═════════════════════════════╬══════════════════╬ ══════════════════╣ ║ 系统变量 (>= 5.5.3) ║ 名称 ║ sql_auto_is_null ║ ║ ║ 变量范围 ║ 全局,会话 ║ ║ ║ 动态变量 ║ 是 ║ ╠═════════════════════════════╬══════════════════╬ ══════════════════╣ ║ 允许值 (类型 ║ boolean ║ ║ ║ 默认 ║ 1 ║ ╠═════════════════════════════╬══════════════════╬ ══════════════════╣ ║ 允许值 (>= 5.5.3) ║ 类型 ║ boolean ║ ║ ║ 默认 ║ 0 ║ ╚═════════════════════════════╩══════════════════╩ ══════════════════╝如果此变量设置为 1(默认值),则在成功插入自动生成的
AUTO_INCREMENT
值的语句之后,您可以通过发出以下形式的语句找到该值:SELECT * FROM <strong><em>tbl_name</em></strong> WHERE <strong><em>auto_col</em></strong> IS NULL
如果语句返回一行,则返回的值与调用
LAST_INSERT_ID()
函数时相同。有关详细信息,包括多行插入后的返回值,请参阅Section 12.14, “Information Functions”。如果没有成功插入AUTO_INCREMENT
值,则SELECT
语句不返回任何行。通过使用
IS NULL
比较来检索AUTO_INCREMENT
值的行为被某些 ODBC 程序使用,例如 Access。见Obtaining Auto-Increment Values。可以通过将sql_auto_is_null
设置为 0 来禁用此行为。
sql_auto_is_null
的默认值在 MySQL 5.5.3 中为 0,在早期版本中为 1。
【讨论】:
以上是关于MySQL 在查询 IS NULL 时返回最后插入的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 左连接时,查询条件查询某个字段为空或者为特定值解决方案
MySQL 左连接时,查询条件查询某个字段为空或者为特定值解决方案