⚠️ 注意:CURRENT_TIMESTAMP 不要加引号 ,写成 DEFAULT CURRENT_TIMESTAMP,写成 'CURRENT_TIMESTAMP' 会当成普通字符串,不是时间函数。
MySQL5.6.5+ 才支持 DATETIME 使用 CURRENT_TIMESTAMP;MySQL8.0 支持表达式默认值(需要包括号 DEFAULT (xxx))
一、时间类系统默认值(你重点关心的)
| 默认值写法 |
适用字段类型 |
说明 |
示例 |
CURRENT_TIMESTAMP |
TIMESTAMP / DATETIME |
当前时间戳(日期+时分秒),插入时自动赋值 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP(n) |
TIMESTAMP(n) / DATETIME(n) |
带微秒,n=0~6 |
dt DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) |
CURRENT_DATE |
DATE |
当前日期(只有年月日),MySQL8.0+支持 |
ct_date DATE DEFAULT (CURRENT_DATE) |
CURRENT_TIME |
TIME |
当前时间(时分秒),MySQL8.0+支持 |
t TIME DEFAULT (CURRENT_TIME) |
ON UPDATE CURRENT_TIMESTAMP |
TIMESTAMP / DATETIME |
不是DEFAULT,是附加属性:该行其他字段更新时,自动刷新为本字段时间 |
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
❗ 坑:NOW() / SYSDATE() 不能直接放在 DEFAULT 里 (MySQL5.7不支持,8.0可以写 DEFAULT (NOW()),但推荐统一用 CURRENT_TIMESTAMP)
二、常量默认值(所有版本通用)
| 默认值 |
适用类型 |
说明 |
NULL |
任意允许NULL字段 |
默认空,col VARCHAR(20) DEFAULT NULL |
''(空字符串) |
CHAR/VARCHAR/TEXT |
字符串空值 |
0 |
TINYINT/INT/BIGINT/FLOAT |
数字默认0 |
1 / -1 / 99 |
数值型 |
自定义固定数字 |
'固定字符串' |
VARCHAR/CHAR |
固定文本,如 'unknown' |
'0000-00-00' |
DATE |
DATE零值(sql_mode严格模式下不推荐) |
'0000-00-00 00:00:00' |
DATETIME/TIMESTAMP |
时间零值(严格模式报错) |
三、MySQL8.0+ 支持【表达式默认值】(必须带括号)
| 默认表达式 |
字段类型 |
说明 |
DEFAULT (UUID()) |
CHAR/VARCHAR |
默认生成UUID字符串 |
DEFAULT (UUID_TO_BIN(UUID())) |
BINARY(16) |
UUID转二进制存储 |
DEFAULT (RAND()) |
FLOAT |
默认随机数0~1 |
DEFAULT (JSON_ARRAY()) |
JSON |
默认空json数组 |
DEFAULT (CURRENT_DATE + INTERVAL 1 DAY) |
DATE |
默认明天日期 |
四、各类型隐式默认值(不写DEFAULT时自动自带)
| 字段类型 |
不写DEFAULT的隐式默认值 |
| INT/TINYINT/BIGINT |
0(NOT NULL);NULL(允许NULL) |
| VARCHAR/CHAR |
''(NOT NULL);NULL(允许NULL) |
| DATE |
0000-00-00(NOT NULL);NULL |
| DATETIME |
0000-00-00 00:00:00(NOT NULL);NULL |
| TIMESTAMP |
受 explicit_defaults_for_timestamp 参数影响 |
常用建表示例
CREATE TABLE test(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32) DEFAULT '',
status TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
create_date DATE DEFAULT (CURRENT_DATE),
uuid_col CHAR(36) DEFAULT (UUID())
);