在 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),但要求是确定性表达式
