SQL字段默认值怎么设置_表设计阶段注意事项讲解【教学】

表设计中设置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,新用户默认开启通知

不建议为 nameemailprice 这类核心业务字段设默认值(如 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
  • 生产环境修改前务必确认应用逻辑是否依赖旧默认值,避免隐性兼容问题

不复杂但容易忽略。