是否存在约束或其他PostgreSQL功能来防止CIDR列的值重叠?
例如:
192.168.1.0/24
和192.168.1.1/32
因为192.168.1.1/32
包含在192.168.1.0/24
子网中,所以它们不能同时存在。
答案 0 :(得分:0)
是的,使用排除约束很容易做到。
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).