如何设置字段默认值_mysql default语法

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