数据类型规范可以具有显式或隐式默认值。
一个默认的
子句显式指示列的默认值。例子:价值
CREATE TABLE t1 (i INT DEFAULT -1, c VARCHAR(10) DEFAULT ", price DOUBLE(16,2) DEFAULT '0.00');
Serial默认值
是一个特例。在整数列的定义中,它是的别名不是null auto_increment唯一
.
中指定的默认值有一个例外默认的
子句必须是一个字面常量;它不能是函数或表达式。这意味着,例如,您不能将日期列的默认值设置为函数的值现在()
或当前日期
.唯一的例外是,for时间戳
而且DATETIME
列,您可以指定CURRENT_TIMESTAMP
作为默认值。看到第11.2.6节“TIMESTAMP和DATETIME的自动初始化和更新”.
如果数据类型规范不包含显式的默认的
值,MySQL决定默认值如下:
若列可取零
作为值,列是用显式的默认为空
条款。
如果列不能取零
作为值,MySQL定义的列没有显式默认的
条款。
的数据输入非空
没有显式的列默认的
条款,如果插入
或取代
语句不包含列的值,也不包含更新
语句将列设置为零
, MySQL根据当时有效的SQL模式处理该列:
如果启用了严格的SQL模式,事务性表将发生错误,语句将回滚。对于非事务性表,会发生错误,但如果发生在多行语句的第二行或后续行,则错误之前的任何行都已经插入。
如果没有启用严格模式,MySQL将列设置为列数据类型的隐式默认值。
假设有一张表t
定义如下:
创建表t (i INT NOT NULL);
在这种情况下,我
没有显式默认值,因此在严格模式下,以下语句都会产生错误,并且没有插入任何行。当不使用严格模式时,只有第三条语句产生错误;隐式默认值被插入到前两个语句中,但是第三个语句失败了,因为默认的(我)
不能产生值:
INSERT INTO t VALUES();INSERT INTO t VALUES(默认);INSERT INTO t VALUES(DEFAULT(i));
对于给定的表,显示创建表
语句显示哪些列具有显式默认的
条款。
隐式默认值定义如下:
对于数字类型,默认为
0
类声明的整数或浮点类型除外AUTO_INCREMENT
属性,默认值是序列中的下一个值。用于日期和时间类型以外的
时间戳
,默认值是合适的”零”值。这也适用于时间戳
如果explicit_defaults_for_timestamp
系统变量已启用(参见第5.1.7节,“服务器系统变量”).否则,对于第一个时间戳
列,默认值为当前日期和时间。看到第11.2节“日期和时间数据类型”.