Запретить перекрывающиеся значения в столбце CIDR в PostgreSQL
Существует ли ограничение или какая-либо другая функция PostgreSQL, которая не позволяет столбцам CIDR иметь перекрывающиеся значения?
Например:
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).