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 是,对于TIMESTAMP和DATETIME列,您可以将CURRENT_TIMESTAMP指定为默认值。参见第 11.2.6 节“ TIMESTAMP 和 DATETIME 的自动初始化和更新”。
不能为BLOB,TEXT,GEOMETRY
和JSON数据类型分配默认值。
隐式默认值的处理
如果数据类型规范不包含显式的DEFAULT
值,则 MySQL 按照以下方式确定默认值:
如果该列可以使用NULL
作为值,则使用显式DEFAULT NULL
子句定义该列。
如果该列不能使用NULL
作为值,则 MySQL 定义该列时不带显式DEFAULT
子句。
为了将数据 Importing 到没有显式DEFAULT
子句的NOT NULL
列中,如果INSERT或REPLACE语句不包含该列的值,或者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));
对于给定的 table,显示创建 table语句显示哪些列具有显式的DEFAULT
子句。
隐式默认值定义如下:
-
对于数字类型,默认值为
0
,但对于使用AUTO_INCREMENT
属性声明的整数或浮点类型,默认值为序列中的下一个值。 -
对于TIMESTAMP以外的日期和时间类型,默认值为该类型的适当“零”值。如果启用了explicit_defaults_for_timestamp系统变量(请参见第 5.1.7 节“服务器系统变量”),则对于TIMESTAMP也是如此。否则,对于 table 中的第一个TIMESTAMP列,默认值为当前日期和时间。参见第 11.2 节“日期和时间数据类型”。