CodeGym /课程 /SQL SELF /向带有约束的表插入数据: NOT NULL, DEFAULT

向带有约束的表插入数据: NOT NULL, DEFAULT

SQL SELF
第 21 级 , 课程 1
可用

今天我们来详细聊聊数据库操作的另一个重要点——怎么往有 NOT NULLDEFAULT 约束的表里插数据。你现在应该已经熟悉 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 NULLDEFAULT 约束

这种列就算你没写值也必须有值。比如 courses 表的 credits 列可以同时有 DEFAULTNOT 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 NULLDEFAULT 约束时,有几个点要注意。比如你数据里经常有 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 查询也会更合理、更可控。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION