数据类型规范可以具有显式或隐式默认值。
数据类型规范中的
子句明确指示列的默认值。例子:
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
。例外情况是,对于TIMESTAMP
和
DATETIME
列,您可以将其指定
CURRENT_TIMESTAMP
为默认值。请参阅第 11.2.6 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”。
如果数据类型规范不包含显式
DEFAULT
值,则 MySQL 确定默认值如下:
如果该列可以NULL
作为值,则使用显式DEFAULT
NULL
子句定义该列。
如果该列不能NULL
作为值,则 MySQL 定义没有显式
DEFAULT
子句的列。
NOT NULL
对于没有显式DEFAULT
子句
的列的数据输入,如果INSERT
or
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));
对于给定的表,该SHOW CREATE
TABLE
语句显示哪些列具有显式DEFAULT
子句。
隐式默认值定义如下:
对于数字类型,默认值为
0
,但对于使用 属性声明的整数或浮点类型AUTO_INCREMENT
,默认值为序列中的下一个值。对于 以外的日期和时间类型
TIMESTAMP
,默认值是该类型的适当“零”值。TIMESTAMP
如果explicit_defaults_for_timestamp
启用了系统变量 ,情况也是如此(请参阅第 5.1.7 节,“服务器系统变量”)。否则,对于表中的第一TIMESTAMP
列,默认值为当前日期和时间。请参阅 第 11.2 节,“日期和时间数据类型”。