- 文档首页
云数据库 TiDB 版
SQL 参考
数据类型默认值
数据类型默认值
在数据类型规范中,DEFAULT 值子句用于指定列的默认值。
您可以为所有数据类型设置默认值。通常,默认值必须是常数,不能是函数或表达式,但也有一些例外情况:
- 对于时间类型,您可以使用 NOW、CURRENT_TIMESTAMP、LOCALTIME 和 LOCALTIMESTAMP 函数作为 TIMESTAMP 和 DATETIME 列的默认值。
- 对于整数型,您可以使用 NEXT VALUE FOR 函数将序列的下一个值设置为列的默认值,并使用 RAND() 函数生成一个随机 float 值作为列的默认值。
如果列定义中没有显式的 DEFAULT 值,TiDB 会按如下方式确定默认值:
- 如果该列可以取 NULL 值,则该列会被定义为显式的 DEFAULT NULL 子句。
- 如果该列不能取 NULL 值,TiDB 会为该列定义时不加显式的 DEFAULT 子句。
对于没有显式 DEFAULT 子句的 NOT NULL 列,在向该列插入数据时,如果 INSERT 或 REPLACE 语句未为该列提供值,TiDB 会根据当时生效的 SQL 模式进行处理:
- 如果启用了严格 SQL 模式,对于事务表会报错并回滚该语句。对于非事务表也会报错。
- 如果未启用严格模式,TiDB 会将该列设置为该数据类型的隐式默认值。
隐式默认值定义如下:
- 对于数值类型,默认值为 0。如果声明了 AUTO_INCREMENT 属性,则默认值为序列中的下一个值。
- 对于除 TIMESTAMP 以外的日期和时间类型,默认值为该类型的合适 “零” 值。对于 TIMESTAMP,默认值为当前日期和时间。
- 对于除 ENUM 以外的字符串类型,默认值为空字符串。对于 ENUM,默认值为第一个枚举值。
TiDB 支持在 DEFAULT 子句中指定以下表达式作为默认值。
- UPPER(SUBSTRING_INDEX(USER(), '@', 1))
- REPLACE(UPPER(UUID()), '-', '')
- DATE_FORMAT(NOW(), '%Y-%m')
- DATE_FORMAT(NOW(), '%Y-%m-%d')
- DATE_FORMAT(NOW(), '%Y-%m-%d %H.%i.%s')
- DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')
- STR_TO_DATE('1980-01-01', '%Y-%m-%d')
TiDB 支持为 BLOB、TEXT 和 JSON 数据类型分配默认值。但您只能使用表达式,而不能使用字面量,为这些数据类型定义默认值。以下是 BLOB 的示例:
使用 UUID 的示例:
使用 JSON 的示例:
不允许的 JSON 示例:
最后两个示例展示了类似的默认值,但只有第一个是合法的,因为它使用了表达式而不是字面量。
最近更新时间:2026.07.02 18:54:10