[译] MySQL 数据类型的默认值
原文地址:https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html
在数据类型规范中 DEFAULT value
表示该列的默认值。默认值必须是常数,不能是一个函数或表达式。 例如,不能将 date 列的默认值设置为函数的值,如 NOW() 或 CURRENT_DATE。唯一例外的是,可以将 CURRENT_TIMESTAMP 指定为 TIMESTAMP 和 DATETIME 类型的默认值。 参考 第 12.3.5 节 “Automatic Initialization and Updating for TIMESTAMP and DATETIME”。
BLOB,TEXT,GEOMETRY 和 JSON 列不能设置默认值。
如果在定义列时没有显式指定默认值(DEFAULT value
),MySQL 将按以下方式设置默认值:
- 如果一个列可以将 NULL 作为一个值,该列就显式定义为:
DEFAULT NULL
。 - 如果一个列不能将 NULL 作为一个值,MySQL 将不对该列显式定义 DEFAULT 属性。
主键列属于特殊情况:如果某一主键列没有显式定义 NOT NULL,MySQL 将为它设置 NOT NULL(因为主键列必须是 NOT NULL) 。在 MySQL 5.7.3 之前,主键列会隐式的加入一个默认值定义,为了避免这种情况,应该在任何主键列的定义中包含一个显式 NOT NULL 。
当没有显示指定默认值的列有数据插入或变更时,如果 INSERT 或 REPLACE 语句不包含该列的值,或者 UPDATE 语句将该列设置为 NULL,则 MySQL 将根据当时的 SQL 模式做处理:
-
如果启用 strict 模式,若是事务表,则会发生错误并回滚SQL语句。若是非事务表,则会发生错误,但多行语句执行时,错误行之前的SQL语句会生效。
-
如果未启用 strict 模式,则 MySQL 将列设置为列数据类型的隐式默认值。
假设一个表 t 的定义如下:
CREATE TABLE t (i INT NOT NULL);
上述定义中,i 列没有显式的指定默认值,因此在 strict 模式下,下面三句SQL都会报错,不会插入数据。在非 strict 模式时,只有第三句报错,前两句会插入隐式默认值(因为 DEFAULT(i) 会报错,不会返回默认值):
INSERT INTO t VALUES();
INSERT INTO t VALUES(DEFAULT);
INSERT INTO t VALUES(DEFAULT(i));
参考 Section 6.1.8, “Server SQL Modes”.
可以使用 SHOW CREATE TABLE tablename
语句查看哪些列有 DEFAULT 语句。
隐式默认值定义如下:
-
数字类型的默认值为 0,声明了 AUTO_INCREMENT 的 integer 和 浮点型字段的默认值为下一个序列值;
-
除 TIMESTAMP 之外的日期和时间类型,默认值为适当“零”值。如果启用了explicit_defaults_for_timestamp 系统变量,则 TIMESTAMP ,则默认值为适当的“零”值(请参见 第 6.1.5 节 “Server System Variables”)。否则,对于表中的第一个 TIMESTAMP 列,默认值为当前日期和时间。请参见 第 12.3 节“Date and Time Types”。
在 integer 列加 SERIAL DEFAULT VALUE 定义,等价于 NOT NULL AUTO_INCREMENT UNIQUE 。