MySQL 8.0 参考手册  / 第 11 章数据类型  /  11.5 数据类型默认值

11.5 数据类型默认值

数据类型规范可以具有显式或隐式默认值。

显式默认处理

数据类型规范中的 子句明确指示列的默认值。例子: DEFAULT value

CREATE TABLE t1 (
  i     INT DEFAULT -1,
  c     VARCHAR(10) DEFAULT '',
  price DOUBLE(16,2) DEFAULT '0.00'
);

SERIAL DEFAULT VALUE是一个特例。在整数列的定义中,它是 的别名 NOT NULL AUTO_INCREMENT UNIQUE

除了一个例外, DEFAULT子句中指定的默认值必须是文字常量;它不能是函数或表达式。这意味着,例如,您不能将日期列的默认值设置为NOW() 或等函数的值CURRENT_DATE。例外情况是,对于TIMESTAMPDATETIME列,您可以将其指定 CURRENT_TIMESTAMP为默认值。请参阅第 11.2.6 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”

不能为 和 数据类型分配默认 值BLOBTEXT

隐式默认处理

如果数据类型规范不包含显式 DEFAULT值,则 MySQL 确定默认值如下:

如果该列可以NULL作为值,则使用显式DEFAULT NULL子句定义该列。

如果该列不能NULL作为值,则 MySQL 定义没有显式 DEFAULT子句的列。例外:如果该列定义为 a 的一部分PRIMARY KEY但未明确定义为NOT NULL,则 MySQL 将其创建为一个 NOT NULL列(因为PRIMARY KEY列必须是NOT NULL),但还会DEFAULT使用隐式默认值为其分配一个子句。为防止这种情况, NOT NULL请在任何 PRIMARY KEY列的定义中包含一个显式。

NOT NULL对于没有显式DEFAULT子句 的列的数据输入,如果INSERTor REPLACE语句不包含该列的值,或者 UPDATE语句将列设置为NULL,则 MySQL 根据当时有效的 SQL 模式处理该列:

  • 如果开启严格SQL模式,事务表会出错,语句会回滚。对于非事务表,会发生错误,但如果多行语句的第二行或后续行发生这种情况,则前面的行已经插入。

  • 如果未启用严格模式,MySQL 会将列设置为列数据类型的隐式默认值。

假设一个表t定义如下:

CREATE TABLE t (i INT NOT NULL);

在这种情况下,i没有明确的默认值,因此在严格模式下,以下每个语句都会产生错误并且不会插入任何行。当不使用严格模式时,只有第三条语句产生错误;为前两个语句插入隐式默认值,但第三个失败,因为DEFAULT(i)无法生成值:

INSERT INTO t VALUES();
INSERT INTO t VALUES(DEFAULT);
INSERT INTO t VALUES(DEFAULT(i));

请参阅第 5.1.10 节,“服务器 SQL 模式”

对于给定的表,该SHOW CREATE TABLE语句显示哪些列具有显式DEFAULT子句。

隐式默认值定义如下: