数据类型的默认值
概述
数据类型的默认值可以是显式或隐式的。
可通过 DEFAULT value 子句显式指定列的默认值。例如:
SERIAL DEFAULT VALUE 是一种特殊情况。在整型列的定义中,它是 NOT NULL AUTO_INCREMENT UNIQUE 的别名。
显式 DEFAULT 子句处理的某些方面受版本影响,如下所述。
MySQL 8.0.13 起的显式默认值的情况
MySQL 8.0.13 前的显式默认值的情况
隐式默认值的情况
MySQL 8.0.13 起的显式默认值的情况
DEFAULT 子句指定的默认值可以是字面量常量或表达式。后者需要放在括号内,以将其与字面量常量默认值进行区分。例如:
仅当值作为表达式编写时,才可为 BLOB、TEXT、GEOMETRY 和 JSON 数据类型指定默认值,即使表达式值是字面量:
这是允许的(字面量默认值指定为表达式):
这会报错(字面量默认值未指定为表达式):
表达式默认值必须遵守以下规则。如果表达式包含不允许的部分,则会报错。
允许使用字面量、内置函数(确定性和非确定性均可)和操作符。
不允许使用子查询、参数、存储函数和用户定义的函数。
表达式默认值不能依赖于具有 AUTO_INCREMENT 属性的列。
列的表达式默认值可以引用其他表的列,但对于引用生成列(generated column)或拥有表达式默认值的列,必须出现在表定义前。也就是说,表达式默认值不能包含生成列或拥有表达式默认值的列的前向引用(forward reference)。
注意:如果表达式默认值的任意组成部分依赖 SQL 模式,则表的不同用法可能会产生不同的结果,除非在所有用法中 SQL 模式保持一致。
插入新行时,可通过省略列名或将列指定为 DEFAULT 来插入具有表达式默认值的列的默认值:
MySQL 8.0.13 前的显式默认值的情况
无法为 BLOB、TEXT GEOMETRY 和 JSON 数据类型指定默认值。
隐式默认值的情况
如果无显式的 DEFAULT 值,则 MySQL 按照以下方式确定默认值:
如果列可接受 NULL 值,则使用显式 DEFAULT NULL 子句定义该列。
如果列不接受 NULL 值,则 MySQL 定义该列时不使用显式 DEFAULT 子句(译者注:不理解这句话)。例外:若列定义为 PRIMARY KEY 但无显式声明 NOT NULL,则 MySQL 将其创建为 NOT NULL 列(因为 PRIMARY KEY 必须为 NOT NULL)。
若开启 SQL 严格模式,则事务表会报错,并且回滚该语句。对于非事务表,也会报错,但如果此报错发生在多行语句(multiple-row statement,译者注:即一条语句影响多行数据)的第二行或更后的行中,则依然会插入前面的行。
若未开启 SQL 严格模式,则 MySQL 将列设置为该列数据类型的隐式默认值。
假设表 t 定义如下:
隐式默认值的定义如下:
对于数值类型,默认值是 0。但对于具有 AUTO_INCREMENT 属性的整型或浮点型列,默认值是序列的下一个值。
对于 ENUM 以外的字符串类型,默认值是空字符串。对于 ENUM 类型,默认值是第一个枚举值。
最后更新于
这有帮助吗?