In article <1343d11c-6f58-4653-8ea8-837c01e61...@unicell.co.il>,
Herouth Maoz <hero...@unicell.co.il> writes:

> On 22/08/2011, at 01:19, Harald Fuchs wrote:

>> In article <caf36091-203e-4c10-aa53-7d9087114...@unicell.co.il>,
>> Herouth Maoz <hero...@unicell.co.il> writes:
>> 
>>> Hi,
>>> I'm designing a new database. One of the table contains allowed IP ranges 
>>> for a customer (Fields: customer_id, from_ip, to_ip) which is intended to 
>>> check - if  an incoming connection's originating IP number falls within the 
>>> range, it is identified as a particular customer.
>> 
>>> Naturally, I'd like to have constraints on the table that prevent entering 
>>> of ip ranges that overlap. Is there a way to do that with exclusion 
>>> constraints? Or do I have to define a new type for this?
>> 
>> This "new type" already exists: ip4r, which can be found in pgfoundry.
>> With it you can do
>> 
>> CREATE TABLE mytbl (
>> iprange ip4r NOT NULL,
>> ...,
>> CONSTRAINT range_check CHECK ((NOT overlap(iprange)))
>> );


> Thank you.

> I assume you can't use a CHECK constraint for between-rows constraints. 
> Wouldn't this  be

> CONSTRAINT EXCLUDE ( iprange WITH && )

> ?

You're right.  In the old PostgreSQL version I had to use I defined a
helper function

  CREATE FUNCTION overlap(ip4r) RETURNS boolean
      LANGUAGE sql
      AS $_$
    SELECT count(*) > 0
    FROM mytbl
    WHERE iprange != $1 AND iprange && $1
  $_$;

for the CHECK CONSTRAINT, but in more recent PostgreSQL versions you can
just say
  EXCLUDE (iprange WITH &&)
(without CONSTRAINT).


-- 
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql

Reply via email to