MySQL中设置字段默认值主要通过DEFAULT关键字实现,可在CREATE TABLE或ALTER TABLE时指定,支持常量、函数(如CURRENT_TIMESTAMP)及标量表达式(8.0.13+),需注意NULL与DEFAULT的独立性及触发条件。

在 MySQL 中设置字段默认值,主要通过 DEFAULT 关键字实现,可在建表(CREATE TABLE)或修改表结构(ALTER TABLE)时指定。
建表时直接设置默认值
这是最常用的方式,在定义列时用 DEFAULT 指定默认值。支持常量、函数(如 CURRENT_TIMESTAMP)、表达式(MySQL 8.0.13+ 支持标量表达式)。
- 字符串类型:用单引号包裹,如
DEFAULT 'unknown' - 数值类型:直接写数字,如
DEFAULT 0或DEFAULT -1 - 时间类型:推荐用
CURRENT_TIMESTAMP,如created_at DATETIME DEFAULT CURRENT_TIMESTAMP - 注意:
NOT NULL字段若没设默认值且插入时未提供值,会报错;设了DEFAULT后可安全省略该字段
给已有字段添加或修改默认值
使用 ALTER TABLE ... ALTER COLUMN ... SET DEFAULT(MySQL 8.0+ 推荐语法),或兼容性更强的 MODIFY COLUMN/CHANGE COLUMN 方式。
- 添加默认值:
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active'; - 修改默认值:
ALTER TABLE users ALTER COLUMN score SET DEFAULT 100; - 移除默认值:
ALTER TABLE users ALTER COLUMN email DROP DEFAULT; - 旧版本(如 MySQL 5.7)可用:
ALTER TABLE users MODIFY COLUMN level TINYINT DEFAULT 1;(会重定义整列,需确保类型不变)
NULL 和 DEFAULT 的关系要分清
DEFAULT 是插入时未显式赋值才生效的兜底值;NULL 是一个特殊标记,不代表“空字符串”或“零”。两者独立:
-
name VARCHAR(50) DEFAULT 'anonymous' NOT NULL:不给值就填 'anonymous',且禁止存 NULL -
remark TEXT DEFAULT NULL:不给值就存 NULL(这也是 TEXT 类型的默认行为) -
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP:既设默认值,又支持自动更新
常见注意事项
实际使用中容易踩坑,需留意以下几点:
- 只有
INSERT语句中完全省略该字段,或显式写DEFAULT,才会触发默认值(如INSERT INTO t(a) VALUES(DEFAULT);) - 如果字段允许 NULL 且没设 DEFAULT,插入时省略它,结果就是 NULL,不是空字符串或 0
- 带函数的默认值(如
CURRENT_TIMESTAMP)不能加括号(CURRENT_TIMESTAMP()在 DEFAULT 中非法) - MySQL 8.0.13 起支持表达式默认值,如
price DECIMAL(10,2) DEFAULT (cost * 1.1),但要求是确定性表达式










