防止 PostgreSQL 中 CIDR 列上的值重叠

Posted

技术标签:

【中文标题】防止 PostgreSQL 中 CIDR 列上的值重叠【英文标题】:Prevent overlapping values on CIDR column in PostgreSQL 【发布时间】:2019-03-21 15:19:50 【问题描述】:

是否存在阻止 CIDR 列具有重叠值的约束或其他一些 PostgreSQL 功能?

例如:

192.168.1.0/24192.168.1.1/32

这些不能同时存在,因为192.168.1.1/32 包含在192.168.1.0/24 子网中。

【问题讨论】:

【参考方案1】:

是的,这很容易通过排除约束来完成。

CREATE TABLE networks (
   id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   net cidr NOT NULL
);

ALTER TABLE networks ADD EXCLUDE USING gist (net inet_ops WITH &&);

INSERT INTO networks (net) VALUES ('192.168.1.0/24');
INSERT 0 1

INSERT INTO networks (net) VALUES ('192.168.1.1/32');
ERROR:  conflicting key value violates exclusion constraint "networks_net_excl"
DETAIL:  Key (net)=(192.168.1.1) conflicts with existing key (net)=(192.168.1.0/24).

【讨论】:

以上是关于防止 PostgreSQL 中 CIDR 列上的值重叠的主要内容,如果未能解决你的问题,请参考以下文章

在不相关列上的 Postgresql 错误中选择 Distinct

postgresql中多个列上的多个索引与单个索引

Postgresql 查询的过滤条件中的列上的字符串操作如何影响它选择的计划

如何从 PostgreSQL 中的两个 IP 获取 CIDR?

选择一列上的值在另一列上具有相同的一组值

如何使用 xpath 表达式在 PostgreSQL 中的 XML 列上创建索引?