Запретить перекрывающиеся значения в столбце CIDR в PostgreSQL - PullRequest
0 голосов
/ 21 марта 2019

Существует ли ограничение или какая-либо другая функция PostgreSQL, которая не позволяет столбцам CIDR иметь перекрывающиеся значения?

Например:

192.168.1.0/24 и 192.168.1.1/32

Они не могут существовать вместе, поскольку 192.168.1.1/32 содержится в подсети 192.168.1.0/24.

1 Ответ

0 голосов
/ 21 марта 2019

Да, это легко сделать с помощью исключения.

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).
...