数据类型规范可以具有显式或隐式默认值。
数据类型规范中的
子句明确指示列的默认值。例子:
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
子句的列。例外:如果该列定义为 a 的一部分PRIMARY KEY
但未明确定义为NOT NULL
,则 MySQL 将其创建为一个
NOT NULL
列(因为PRIMARY
KEY
列必须是NOT NULL
),但还会DEFAULT
使用隐式默认值为其分配一个子句。为防止这种情况,
NOT NULL
请在任何
PRIMARY KEY
列的定义中包含一个显式。
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 节,“日期和时间数据类型”。