MySQL MAX函数的奇怪行为

时间:2017-10-09 19:21:52

标签: mysql

假设我的MySQL表中还没有插入行。

CREATE TABLE Users (
SerialNo INT(9) NOT NULL AUTO_INCREMENT, 
UserID INT(9) NOT NULL,
PRIMARY KEY (SerialNo)
);

当我运行以下MySQL语句时:

INSERT INTO Users(UserID) SELECT MAX(UserID)+1 FROM Users;

该表如下图所示:

图片链接:https://s1.postimg.org/4r2xcc7ajj/z_Ii_A-_KUp_Tzio_-00_PBL0_KQ.png

有人可以告诉我为什么MAX(UserID)+1设置 0 而不是 1

2 个答案:

答案 0 :(得分:3)

  • 0是用于没有默认值的int字段的默认值 指定。
  • 通常会导致将空值插入非空字段 在给定空值的字段中分配它的默认值 代替。
  • 大多数聚合函数仅在返回时才返回null 不会遇到非空值。
  • 由于表为空,MAX返回null,NULL + 1为NULL。
  • 您在没有指定默认值的情况下将null插入整数字段。

编辑:要在这种情况下插入1,请使用IFNULL(MAX(UserId),0)+1

答案 1 :(得分:0)

正如max()上的mysql手册所说:max()如果没有匹配的记录则返回null。如果表中根本没有记录,则max(userid)返回null。

null + 1也将为空。因此,您查询尝试将null插入表中。

您的mysql配置为strict mode已关闭,因此当您尝试将空值插入非空字段时,mysql会以静默方式将null转换为字段隐式默认值。对于整数字段,这恰好为0。

如果启用了严格模式,那么您将收到一条错误消息,指示您尝试在表中插入非法值。这样,您只会收到警告。

顺便说一句,你应该打开严格模式。