🗄️ 第四章 管理数据-避免非法数据的功能
📄 一句话概括

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,同样支持。)

五、常见误区

自测三问 1. DEFAULT 什么时候生效?(插入语句没提到这一列时) 2. 显式写 NULL 会触发 DEFAULT 吗?(不会,得 NULL) 3. score DEFAULT 0 且插入时写了 NULL,查出来是什么?(NULL——省略和显式空是两回事)

相关笔记