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 左连接时,查询条件查询某个字段为空或者为特定值解决方案

返回json时,字段为null的处理方式

SQL Server-聚焦WHERE Column=@Param OR @Param IS NULL有问题?

使用PHP在mysql中插入数据时返回最后一个id

在MySQL中is null, is not null对索引的影响【测试】