防止 PostgreSQL 中 CIDR 列的值重叠

Edm*_*ond 5 postgresql exclusion-constraint

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

例如:

192.168.1.0/24192.168.1.1/32

它们不能共存,因为192.168.1.1/32它们包含在192.168.1.0/24子网中。

Lau*_*lbe 7

是的,通过排除约束很容易做到这一点。

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).
Run Code Online (Sandbox Code Playgroud)

net每当您尝试插入重叠值(&&是“重叠”运算符)的两行时,排除约束都会导致错误。