防止 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/24
和 192.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 查询的过滤条件中的列上的字符串操作如何影响它选择的计划