Запретить перекрывающиеся значения в столбце 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).
Другие вопросы по тегам