11.6 数据类型默认值

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

处理默认违约

数据类型规范中的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的别名。

除一个 exception,DEFAULT子句中指定的默认值必须为 Literals 常量;它不能是函数或 table 达式。例如,这意味着您不能将日期列的默认值设置为NOW()CURRENT_DATE之类的函数的值。唯一的 exception 是,对于TIMESTAMPDATETIME列,您可以将CURRENT_TIMESTAMP指定为默认值。参见第 11.2.6 节“ TIMESTAMP 和 DATETIME 的自动初始化和更新”

不能为BLOBTEXTGEOMETRYJSON数据类型分配默认值。

隐式默认值的处理

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

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

如果该列不能使用NULL作为值,则 MySQL 定义该列时不带显式DEFAULT子句。

为了将数据 Importing 到没有显式DEFAULT子句的NOT NULL列中,如果INSERTREPLACE语句不包含该列的值,或者UPDATE语句将列设置为NULL,则 MySQL 将根据有效的 SQL 模式处理该列。时间:

  • 如果启用了严格的 SQL 模式,则事务 table 将发生错误,并且该语句将回滚。对于非事务 table,会发生错误,但是如果此错误发生在多行语句的第二行或后续行中,则会插入前面的行。

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

假设 tablet定义如下:

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));

See 第 5.1.10 节“服务器 SQL 模式”.

对于给定的 table,显示创建 table语句显示哪些列具有显式的DEFAULT子句。

隐式默认值定义如下: