表设计中设置SQL字段默认值需用DEFAULT关键字,匹配字段类型:数值型如INT DEFAULT 0,字符串型如VARCHAR DEFAULT 'pending',日期型推荐CURRENT_TIMESTAMP,布尔型依数据库而异;状态、时间戳、计数、开关类字段适合设默认值,核心业务字段不宜设;NULL与DEFAULT独立控制;修改默认值仅影响后续插入,不更新历史数据。

在表设计阶段设置 SQL 字段默认值,核心是用 DEFAULT 关键字配合合适的数据类型与业务逻辑。不是所有字段都适合设默认值,设错反而引发数据歧义或维护困难。
DEFAULT 值的写法和常见类型
默认值必须与字段类型兼容,且书写方式有明确规则:
- 数值类型(如 INT、DECIMAL)可直接写常量:
score INT DEFAULT 0 - 字符串类型(如 VARCHAR)需加单引号:
status VARCHAR(20) DEFAULT 'pending' - 日期时间类型推荐用函数(非固定字符串):
created_at DATETIME DEFAULT CURRENT_TIMESTAMP - 布尔类型注意数据库差异:MySQL 用
TINYINT(1)或BOOLEAN(本质同义),PostgreSQL 支持BOOLEAN DEFAULT false - 不能对 TEXT、BLOB、JSON 等大对象类型使用函数作为默认值(MySQL 8.0.13+ 对 JSON 有限支持,但慎用)
哪些字段适合设默认值?
默认值应反映业务中“未显式提供时最合理、最安全的取值”,不是为了省事随便填:
-
状态类字段:如
is_deleted TINYINT DEFAULT 0(0 表示未删除)、status VARCHAR(10) DEFAULT 'draft' -
时间戳字段:如
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,避免应用层漏传 -
计数类字段:如
view_count INT DEFAULT 0,防止空值干扰聚合计算 -
配置开关字段:如
enable_email_notify BOOLEAN DEFAULT true,新用户默认开启通知
不建议为 name、email、price 这类核心业务字段设默认值(如 DEFAULT '未知'),容易掩盖录入问题或污染分析结果。
NULL 与 DEFAULT 的关系要理清
默认值不等于禁止 NULL;是否允许 NULL 由 NULL / NOT NULL 单独控制:
-
nickname VARCHAR(50) DEFAULT '游客' NOT NULL:不填时自动填“游客”,且不允许显式插入 NULL -
remark TEXT DEFAULT NULL:等价于不写 DEFAULT,字段可为空,无默认行为 -
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP:MySQL 特有,既设默认值,又支持更新时自动刷新
特别注意:如果字段定义为 NOT NULL 但没设 DEFAULT,插入时不提供该字段会报错(除非是自增主键等特殊情况)。
修改默认值的注意事项
上线后修改 DEFAULT 是常见需求,但不同数据库语法和影响不同:
- MySQL:用
ALTER TABLE t MODIFY COLUMN c VARCHAR(10) DEFAULT 'new'或ALTER TABLE t ALTER COLUMN c SET DEFAULT 'new'(后者要求 8.0.13+) - PostgreSQL:用
ALTER TABLE t ALTER COLUMN c SET DEFAULT 'new',不会影响已有数据 - 重要提醒:修改 DEFAULT 不会批量更新历史数据,只对后续 INSERT 生效;若想补全旧记录,需额外执行
UPDATE - 生产环境修改前务必确认应用逻辑是否依赖旧默认值,避免隐性兼容问题
不复杂但容易忽略。










