MySQL默认值(DEFAULT)用于字段未指定值时自动填充,保障插入成功且避免NULL,支持常量、时间函数等,可动态修改但不影响已有数据。

MySQL 中的默认值(DEFAULT)主要解决“字段没给值时怎么办”这个问题。它不是可有可无的修饰,而是保障插入操作能顺利执行、数据结构更健壮的关键机制。
自动填充未指定字段
插入数据时,如果某列在 INSERT 语句中被省略,且该列设置了 DEFAULT,MySQL 就不会报错,也不会让它变成 NULL(除非显式允许 NULL 且没设默认值),而是直接填入你定义的默认值。
- 例如:
status VARCHAR(20) DEFAULT 'pending',插入时不写 status 字段,新记录自动为 'pending' - 时间字段常用:
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,省去每次手写 NOW() - 数字字段如:
sort_order INT DEFAULT 0,避免因遗漏导致 NULL 或插入失败
配合非空约束防止报错
当字段定义为 NOT NULL 又没给默认值,INSERT 时若漏掉该字段,MySQL 直接报错(ERROR 1364)。加上 DEFAULT 后,既保持非空,又让插入更宽松。
- 推荐组合:
is_deleted TINYINT NOT NULL DEFAULT 0,比允许 NULL 更清晰可控 - 注意:DEFAULT NULL 是合法写法,但和不设默认值效果一样——省略该字段时仍存为 NULL
- 类型必须匹配,比如不能给 DATE 字段设 DEFAULT 'abc'
支持常量、函数与简单表达式
MySQL 允许的默认值类型有限制,但覆盖大多数实用场景:
- 常量:'draft'、100、-1、true
- 时间函数:CURRENT_TIMESTAMP、NOW()、CURRENT_DATE(注意:CURRENT_TIME 不支持作为列默认值)
-
表达式:仅限“常量表达式”,如
DEFAULT (1 + 1)或DEFAULT 'v1_',但不能引用其他列或使用子查询
运行时可动态调整
表建好后,默认值不是一成不变的。用 ALTER TABLE 可随时修改或清除:
- 设新默认值:
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'inactive'; - 删掉默认值:
ALTER TABLE users ALTER COLUMN status DROP DEFAULT; - 注意:修改默认值只影响后续 INSERT,已有数据不受影响










