PostgreSQL - 约束:数据完整性的友好指南

你好,未来的数据库大师们!? 今天,我们将深入探讨PostgreSQL约束的奇妙世界。如果你是新手,不用担心;我们会一步一步来,到了最后,你将能够像专业人士一样约束数据!让我们一起开始这段激动人心的旅程。

PostgreSQL - Constraints

约束是什么?

在我们开始之前,让我们先谈谈约束是什么。想象你正在搭积木房子。每块积木都需要放得恰到好处,否则整个结构可能会倒塌。数据库中的约束就像是搭建积木房子的规则——它们确保我们的数据结构正确并保持其完整性。

约束类型

PostgreSQL提供了几种类型的约束。让我们通过示例和解释来探讨每一种。

约束类型 描述
NOT NULL 确保列不能有NULL值
UNIQUE 确保列中的所有值都是不同的
PRIMARY KEY 在表中唯一标识每一行
FOREIGN KEY 在表之间链接数据
CHECK 确保列中的所有值满足特定条件
EXCLUSION 确保如果任何两行在指定列上使用指定操作符进行比较,不是所有比较都会返回TRUE

NOT NULL约束

NOT NULL约束就像一个严格的老师,不会接受测试上的空白答案。它确保列必须始终包含一个值。

让我们为我们的想象书店创建一个表:

CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
price DECIMAL(10, 2)
);

在这个示例中,titleauthor是NOT NULL,意味着每本书都必须有标题和作者。然而,price可以是NULL,也许对于尚未定价的书籍来说。

UNIQUE约束

UNIQUE约束就像给你的朋友分配唯一的昵称。没有两个可以有相同的昵称。

让我们在我们的books表中添加一个UNIQUE约束:

ALTER TABLE books
ADD CONSTRAINT unique_isbn UNIQUE (isbn);

现在,如果我们尝试添加两本ISBN相同的书:

INSERT INTO books (title, author, isbn) VALUES ('Book 1', 'Author 1', '1234567890');
INSERT INTO books (title, author, isbn) VALUES ('Book 2', 'Author 2', '1234567890');

第二个INSERT将会失败,保持我们的数据干净且唯一!

PRIMARY KEY约束

PRIMARY KEY就像运动队的队长——唯一且至关重要。它唯一标识表中的每一行。

我们已经在我们的books表中定义了一个PRIMARY KEY(book_id),但是让我们创建另一个表来演示:

CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);

在这里,customer_id是我们的PRIMARY KEY。它会自动递增,且对每个新客户都是唯一的。

FOREIGN KEY约束

FOREIGN KEY就像社交网络中的连接。它们在表之间链接数据。

让我们创建一个orders表,它引用我们的customers表:

CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER,
order_date DATE NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

现在,我们不能为在customers表中不存在的客户添加订单。就像尝试将信件发送到一个不存在的地址!

CHECK约束

CHECK约束就像夜总会的保安,确保只有正确的数据才能进入。

让我们在我们的books表中添加一个CHECK约束,以确保所有书籍的价格都是正数:

ALTER TABLE books
ADD CONSTRAINT positive_price CHECK (price > 0);

现在,如果我们尝试添加一个价格为负数的书籍:

INSERT INTO books (title, author, price) VALUES ('Cheap Book', 'Frugal Author', -5.99);

PostgreSQL会礼貌地拒绝,保持我们的数据逻辑上的一致性。

EXCLUSION约束

EXCLUSION约束就像桌游中的复杂规则。它在需要时很高级,但很有用。

想象我们正在安排活动,并希望确保没有两个活动在同一个房间内重叠:

CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
room_no INTEGER,
event_start TIMESTAMP,
event_end TIMESTAMP,
EXCLUDE USING gist (room_no WITH =, tsrange(event_start, event_end) WITH &&)
);

这确保了对于任何两行,不可能同时满足房间号相等且时间范围重叠。

删除约束

有时,我们需要删除约束,就像改变游戏规则一样。以下是如何删除约束的方法:

-- 删除一个命名约束
ALTER TABLE books DROP CONSTRAINT unique_isbn;

-- 删除PRIMARY KEY
ALTER TABLE books DROP CONSTRAINT books_pkey;

-- 删除FOREIGN KEY
ALTER TABLE orders DROP CONSTRAINT orders_customer_id_fkey;

记住,删除约束应该谨慎操作,因为它可能会影响数据完整性!

结论

恭喜你!你刚刚完成了PostgreSQL约束的盛大之旅。从NOT NULL到EXCLUSION,你现在有了保持数据清洁、一致和结构良好的工具。记住,使用约束就像为房子打下坚实的基础——它可能需要一些额外的前期努力,但它可以让你避免很多以后的麻烦。

在你继续PostgreSQL旅程的同时,继续尝试这些约束。尝试以不同的方式组合它们,你很快就会发现自己能够创建出健壮且可靠的数据库设计。快乐约束!

Credits: Image by storyset