[译] 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”。

  • 除 ENUM 之外的字符串类型,默认值为空字符串。对于ENUM,默认值是第一个枚举值。

在 integer 列加 SERIAL DEFAULT VALUE 定义,等价于 NOT NULL AUTO_INCREMENT UNIQUE 。

你可能感兴趣的:([译] MySQL 数据类型的默认值)