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