意外行为INT NOT NULL DEFAULT -1

时间:2013-12-20 11:02:42

标签: mysql

我很少使用负数(个人财务除外),所以也许这就是为什么我的知识存在差距......

在SO(How to achieve default value if column value is NULL?)中对其他用户提出的问题的回复提示时,请考虑以下内容:

-- Mysql Version 5.5.16
-- sql_mode = ''

DROP TABLE prices;

CREATE TABLE prices (price_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,price INT SIGNED NOT NULL DEFAULT -1);

INSERT INTO prices (price) VALUES (' '),(''),(NULL);
INSERT INTO prices (price_id) VALUES (NULL);

SELECT * FROM prices;

Expected output:
+----------+-------+
| price_id | price |
+----------+-------+
|        1 |    -1 | 
|        2 |    -1 | 
|        3 |    -1 |
|        4 |    -1 |
+----------+-------+

Actual output:
+----------+-------+
| price_id | price |
+----------+-------+
|        1 |     0 |
|        2 |     0 |
|        3 |     0 |
|        4 |    -1 |
+----------+-------+

为什么?

中级答案:简而言之,似乎如果你想确保插入默认值(当没有设置sql_mode时), 要么忽略INSERT 中的列,要么明确地插入一个DEFAULT值,即:INSERT INTO prices (price) VALUES(DEFAULT);对我而言,这违背了DEFAULT值的精神!?!?

2 个答案:

答案 0 :(得分:1)

似乎:

a。)如果为非空数字字段(不是自动增量)提供NULL值,则默认值为零。

b。)如果你没有提供一个值(如在最后一行),你使用给定的默认值(-1)

http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html

答案 1 :(得分:1)

如果您使用Mysql STRICT MODE,则结果可能会有所不同。

目前您提供的值为NULL,服务器会尝试将此值映射到最接近的INT值。服务器未使用默认值-1,因为它将NULL作为有效值。