【问题标题】:Prevent overlapping values on CIDR column in PostgreSQL防止 PostgreSQL 中 CIDR 列上的值重叠
【发布时间】:2019-03-21 15:19:50
【问题描述】:

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

例如:

192.168.1.0/24192.168.1.1/32

这些不能同时存在,因为192.168.1.1/32 包含在192.168.1.0/24 子网中。

【问题讨论】:

    标签: postgresql exclusion-constraint


    【解决方案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).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多