数据可以很多,但不是每条都靠谱。为了不让表变成垃圾场,PostgreSQL允许你加一些约束。这就像简单的规则,防止有人在“名字”字段里写数字,或者直接留空。
什么是constraints?
约束(constraints)在PostgreSQL里就像军队里的行为规范。如果没有,谁都能乱来:比如把用户年龄写成-999,名字留空,或者同一个学生用不同id加两遍。为了不让这些事发生,PostgreSQL提供了叫做约束的控制机制。
约束能帮你:
- 让你的数据保持有效和一致。
- 确保数据符合某些规则(比如年龄不能是负数)。
- 如果数据不对,能更快发现问题。
今天我们来看两个最常用的约束:NOT NULL和UNIQUE。
NOT NULL约束
NOT NULL约束告诉PostgreSQL:“喂,这个字段必须有值,不能不确定!”如果你往表里加一行,某个字段是NULL,PostgreSQL会直接报错。这个特别适合那些必须填的字段,比如学生的名字或者生日。
NOT NULL的用法例子
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- 唯一标识符
name VARCHAR(100) NOT NULL, -- 老师名字(必填)
subject VARCHAR(50) NOT NULL -- 他教的科目(必填)
);
在这个例子里,name和subject这两列都不能留空。如果你插入一行但没给这两个字段赋值,就会报错。
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Mathematics');
结果:错误!你没写老师的名字,而name是必须要有值的。
UNIQUE约束:要求唯一性
UNIQUE约束保证某一列或者几列组合的值不会重复。比如你想确保两个学生不能有一样的学号。
如果说NOT NULL像是“所有来宾都得穿衣服”,那UNIQUE就是“派对上不能有两个人穿一样的衣服”。
UNIQUE用法例子
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- 唯一标识符
name VARCHAR(100) UNIQUE -- 部门名称必须唯一
);
现在你不能加两个名字一样的部门了。
INSERT INTO departments (name) VALUES ('Mathematics');
INSERT INTO departments (name) VALUES ('Mathematics');
结果:错误!你试图插入重复的name值。
组合UNIQUE约束
你也可以让两列(或更多)组合起来唯一。比如:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- 记录的唯一标识符
student_id INTEGER NOT NULL, -- 学生ID
course_id INTEGER NOT NULL, -- 课程ID
UNIQUE (student_id, course_id) -- 一个学生不能重复选同一门课
);
现在每个student_id和course_id的组合都必须唯一。如果有人想让同一个学生重复选同一门课,PostgreSQL会拦住他。
组合约束:NOT NULL和UNIQUE
你可以把NOT NULL和UNIQUE一起用在同一列。比如:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- 登录名唯一且必填
email VARCHAR(100) NOT NULL UNIQUE -- 邮箱唯一且必填
);
这里登录名和邮箱都必须唯一,也不能留空。
用约束时常见的坑
如果你只给一列加了UNIQUE,没加NOT NULL,那你可以插入多行NULL值,因为PostgreSQL认为NULL和NULL不一样。如果你想禁止空值,记得加NOT NULL。
往有UNIQUE约束的列插入重复值会报错。插入前一定要检查数据。
约束太多会让插入操作变慢。
为啥要这么做?
用约束能帮你避免很多麻烦,比如数据重复、空行,还有各种因为手滑导致的错误。它们让你的数据库“自我保护”,项目大了能省下不少时间。面试时经常会问到约束,所以懂NOT NULL和UNIQUE不仅实用,还能让你在老板面前加分。
下节课我们会讲DEFAULT约束,它能让你给列设置默认值,如果用户啥都没填就用默认的。下次见!
GO TO FULL VERSION