介绍
在设计数据库的过程中,如我上一篇文章所述,我决定利用 EXCLUDE 约束来维护数据完整性。在考虑这个问题时,我意识到 EXCLUDE 运算符值得一篇专门的文章。
排除运算符简介
PostgreSQL以其众多强大的功能而闻名,其中之一就是EXCLUDE 运算符。此运算符允许您对表列中的值集创建高级约束。在本文中,我想深入研究 EXCLUDE 运算符,提供其用法示例,并帮助您了解如何利用它来构建灵活高效的数据库。
与 PostgreSQL 中的 UNIQUE 约束类似,EXCLUDE 运算符用于定义表列中值集的约束。但是,与 UNIQUE 不同,它使您能够指定规则来确定哪些值不能在特定列或一组列中共存。EXCLUDE 运算符通常与 GiST 或 SP-GiST 索引类型一起使用,以确保查询效率,尽管它也可以与常规 B 树索引一起使用。
使用示例
使用 EXCLUDE 的一个常见示例是对重叠时间间隔应用约束,例如电影院中的电影放映。
CREATE TABLE events (
id serial primary key,
event_time tstzrange,
constraint no_screening_time_overlap exclude using gist (
event_time WITH &&
)
);
INSERT INTO events (event_time) VALUES ('["2023-01-01 19:00:00", "2023-01-01 20:45:00"]');
在上面的例子中,我们创建了一个名为“events”的表,并插入一条带有时间间隔的记录。您可以在 SQLize.online 上检查 SQL。之后,您可以尝试插入另一行,其间隔与表中的现有间隔重叠。最有可能的是,它会导致错误。如果您成功了,请在评论中告诉我!
与 UNIQUE 类似,EXCLUDE 约束可以应用于一组列。例如,您可以使用时间戳类型的“event_start”和“event_end”列并限制时间重叠。下面是一个示例:
CREATE TABLE events (
event_id serial primary key,
event_name VARCHAR(100) NOT NULL,
event_start TIMESTAMPTZ NOT NULL,
event_end TIMESTAMPTZ NOT NULL,
EXCLUDE USING GIST (event_start WITH &&, event_end WITH &&)
);
还可以使用 EXCLUDE 对数值范围施加约束。看看这个例子:
CREATE TABLE ranges (
range_id serial primary key,
start_value INTEGER NOT NULL,
end_value INTEGER NOT NULL,
EXCLUDE USING GIST (int4range(start_value, end_value, '[]') WITH &&)
);
在此示例中,将创建包含数字范围的“范围”表。具有 GiST 索引的 EXCLUDE 运算符指定“start_value”和“end_value”列中的数值范围不能重叠。
另一个重要的应用是限制几何图形的交集:
CREATE TABLE polygons (
polygon_id serial primary key,
polygon_data geometry(Polygon) NOT NULL,
EXCLUDE USING GIST (polygon_data WITH &&)
);
在这里,将创建“多边形”表,该表存储有关多边形的信息。带有 GiST 索引的 EXCLUDE 运算符可确保“polygon_data”列中的几何对象不能相交或包含在彼此内部。
在上述所有示例中,我们使用了基于 GiST 索引的 EXCLUDE 约束。但是,为了完整起见,让我们提供一个使用 R 树的示例:
CREATE TABLE users (
user_id serial primary key,
email VARCHAR(255) NOT NULL,
EXCLUDE USING btree (lower(email) WITH =)
);
在此示例中,我们几乎复制了 UNIQUE 约束的功能,但稍作修改。我们的独特性现在不区分大小写。
结论
PostgreSQL 中的 EXCLUDE 运算符提供了对表列中的值集创建高级约束的功能。它允许您定义限制不能共存的值组合的规则。这对于确保数据完整性和在数据库级别执行复杂检查特别有用。
在本文中,我们探讨了使用 EXCLUDE 运算符的几个示例,包括对重叠时间间隔的约束、禁止相交的几何对象以及对非重叠数值范围的约束。EXCLUDE 运算符是一个强大的工具,可用于在 PostgreSQL 中构建灵活高效的数据库。
在项目中,利用 EXCLUDE 运算符创建复杂的约束并确保数据库级别的数据完整性。这将帮助您维护数据库的结构和可靠性,同时优化其使用。