今天我们来详细聊聊数据库操作的另一个重要点——怎么往有 NOT NULL 和 DEFAULT 约束的表里插数据。你现在应该已经熟悉 INSERT INTO 的基本语法,也知道怎么往结构化的表里加行。现在是时候深入细节了——因为处理约束经常让开发者头疼。但别担心,等你看完这节课,这些机制你就能轻松驾驭啦!
什么是约束?
约束就是加在表的列上的规则。它们帮你保证数据是合理的。比如,有些字段必须有值(NOT NULL),不能留空;或者你可以不写某个字段的值,如果有默认值(DEFAULT),数据库会自动填上。
约束的种类: - NOT NULL —— 表示这个列不能是 NULL。 - DEFAULT —— 给列设置一个默认值,如果你没写,数据库就用这个值。
约束能帮你保持数据完整。想象一下,你有个 students 表存学生名单,规则之一是每个学生都必须有名字(NOT NULL)。如果没有这个约束,有人忘了填名字,数据库里就会出现“无名学生”。再比如,你决定新课程的学分默认是 0(DEFAULT),这样每次都不用手动填。
处理 NOT NULL 约束
NOT NULL 约束要求你在插入数据时必须给这个列赋值。如果你试图插入 NULL 或者根本没写这个字段,数据库会“生气”(报错)。来看个例子。
创建一个简单的 students 表:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- 名字不能为空
age INT
);
注意:name 列有 NOT NULL 约束,age 列没有。
带 NOT NULL 的插入数据示例
现在我们来加几个学生:
-- 插入成功的例子
INSERT INTO students (name, age) VALUES ('Alice', 23);
-- 成功:名字写了,满足 NOT NULL 约束
-- 错误示例:
INSERT INTO students (age) VALUES (30);
-- 错误:name 字段不能为 NULL,因为有 NOT NULL 约束
如果你遇到类似 null value in column "name" violates not-null constraint 的报错,别慌——这只是 PostgreSQL 提醒你要注意点。
使用默认值 (DEFAULT)
DEFAULT 约束告诉数据库:“如果有人忘了填这个字段,就用这个默认值。” 这样开发者就不用每次都手动填一遍了。
带 DEFAULT 约束的表例子
我们来建个 courses 表:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
credits INT DEFAULT 0 -- credits 字段的默认值是 0
);
带 DEFAULT 的插入数据示例
现在加几个课程:
-- 明确写了 credits 的值
INSERT INTO courses (name, credits) VALUES ('Mathematics', 5);
-- 没写 credits,自动用默认值(0)
INSERT INTO courses (name) VALUES ('History');
-- 看看结果
SELECT * FROM courses;
结果:
| id | name | credits |
|---|---|---|
| 1 | Mathematics | 5 |
| 2 | History | 0 |
注意:加 History 课程时没写学分,PostgreSQL 自动把 credits 填成了 0。
同时用 NOT NULL 和 DEFAULT 约束
这种列就算你没写值也必须有值。比如 courses 表的 credits 列可以同时有 DEFAULT 和 NOT NULL,这样就能保证没人会把它留空 NULL。
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
credits INT NOT NULL DEFAULT 0
);
插入数据示例
假设每个新课程默认学分是 0,但 NULL 不允许。
-- 成功:credits 用默认值
INSERT INTO courses (name) VALUES ('Physics');
-- 错误:试图插入 NULL 到 NOT NULL 的列
INSERT INTO courses (name, credits) VALUES ('Chemistry', NULL);
例子:添加必须有名字的学生
建一个带约束的 students 表:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL, -- 名字必填
enrollment_date DATE DEFAULT CURRENT_DATE -- 入学日期默认是今天
);
现在往里加学生:
-- 写了名字,入学日期自动填
INSERT INTO students (name) VALUES ('Bob');
-- 不写名字(会报错)
INSERT INTO students (enrollment_date) VALUES ('2024-10-01');
这就是 PostgreSQL 帮你保证数据正确性的好例子:所有学生都必须有名字,入学日期不用你手动写。
小贴士和“坑”
用 NOT NULL 和 DEFAULT 约束时,有几个点要注意。比如你数据里经常有 NULL,那 NOT NULL 约束可能会让你很头疼。如果所有列都设了默认值,也可能会不小心插入不对的数据(比如 0 代替真实值)。
通常你给已有表加新列时,老数据的这一列会是 NULL。但如果你写了 DEFAULT X,整列都会用 X 填满。这很方便,也能帮你保持数据库完整性。
比如,新列是指向另一个表的 FOREIGN KEY,不能是 NULL 或 0,必须指向已有表的行。
如果忘了加约束怎么办?
别慌——你随时可以用 ALTER TABLE 命令加约束。比如:
-- 给已有列加 DEFAULT 约束
ALTER TABLE courses ALTER COLUMN credits SET DEFAULT 0;
-- 给已有列加 NOT NULL 约束
ALTER TABLE students ALTER COLUMN name SET NOT NULL;
这些操作不会破坏已有数据——可以放心用在已经有内容的表上。
现在你已经准备好用 PostgreSQL 的强大约束功能啦!你的数据会更有结构、更安全,SQL 查询也会更合理、更可控。
GO TO FULL VERSION