📄 一句话概括
DEFAULT 给列预备一个默认值:插入时没填这一列,就自动用默认值顶上——省事,更重要的是保证「忘填」不等于「留了个洞」。
📝 本节和前面几节的关系
上一节(4-6)画了约束总图,本节讲第一个约束:DEFAULT。它是最温和的一个——不拦人、不报错,只是在数据缺席时替你补位。它与下一节 4-8 是一枚硬币的两面:没填时,是给默认值,还是给 NULL?
一、语法与效果
CREATE TABLE students (
id INT,
name VARCHAR(20),
score DECIMAL(5,2) DEFAULT 0 -- 不填默认 0
);
两种插入方式对比:
-- 写了列名单,没写 score → score 得 0
INSERT INTO students (id, name) VALUES (1, '张三');
-- 明确写了 NULL → score 是 NULL,不是 0!
INSERT INTO students (id, name, score) VALUES (2, '李四', NULL);
关键区分:DEFAULT 只在「这一列没被提及」时生效;明确写 NULL 会绕过 DEFAULT(NULL 是「我特意要空」——4-8 正题)。
二、什么时候用 DEFAULT
| 场景 | 默认值 |
|---|---|
| 新用户未设积分 | score DECIMAL(5,2) DEFAULT 0 |
| 未填收货城市 | city VARCHAR(20) DEFAULT '未填写' |
| 状态字段初始值 | status VARCHAR(10) DEFAULT 'pending' |
原则:这一列大多数时候的值是固定的,就把它设为默认。
三、动手 Demo:默认值与显式 NULL 的分野
CREATE TABLE t (
id INT,
score DECIMAL(5,2) DEFAULT 0
);
INSERT INTO t (id) VALUES (1); -- 没提 score
INSERT INTO t (id, score) VALUES (2, NULL); -- 明确给 NULL
INSERT INTO t (id, score) VALUES (3, 90); -- 正常给值
SELECT id, score FROM t;
id score
1 0
2 (NULL)
3 90
三条路三种结果——省略、显式空、显式值,数据库分得清清楚楚。
四、30 秒实验
把 DEFAULT 值改成表达式:MySQL 里写 created_at DATETIME DEFAULT CURRENT_TIMESTAMP,插入不填时间列,查出自动是当前时刻。(SQLite 需建表时用 DEFAULT CURRENT_TIMESTAMP,同样支持。)
五、常见误区
- 「不填列就是 NULL」:有 DEFAULT 时是默认值,除非显式写 NULL
- 「DEFAULT 能拦住非法数据」:它只管「缺省时给什么」;值本身合不合规仍是类型和其他约束的事
自测三问
1. DEFAULT 什么时候生效?(插入语句没提到这一列时) 2. 显式写 NULL 会触发 DEFAULT 吗?(不会,得 NULL) 3. score DEFAULT 0 且插入时写了 NULL,查出来是什么?(NULL——省略和显式空是两回事)- ☐ 下一节(4-8 NULL-当没有放入任何数据时)
相关笔记
- 约束、属性-限制允许保存的数据 —— 上一节:约束总图
- NULL-当没有放入任何数据时 —— 下一节:没填的另一种结局
- IN、LIKE、IS NULL-用于查询的符号2-包含值的数据、查询空数据 —— 查询侧怎么抓 NULL
- 🗄️ 数据库基础 · 索引 —— 全课路线图