Re: exclusion constraint for ranges of IP
От | Harald Fuchs |
---|---|
Тема | Re: exclusion constraint for ranges of IP |
Дата | |
Msg-id | 86hb595v7l.fsf@mgm.protecting.net обсуждение исходный текст |
Ответ на | exclusion constraint for ranges of IP (Herouth Maoz <herouth@unicell.co.il>) |
Список | pgsql-sql |
In article <1343D11C-6F58-4653-8EA8-837C01E6184F@unicell.co.il>, Herouth Maoz <herouth@unicell.co.il> writes: > On 22/08/2011, at 01:19, Harald Fuchs wrote: >> In article <CAF36091-203E-4C10-AA53-7D9087114D35@unicell.co.il>, >> Herouth Maoz <herouth@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, itis 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 wayto 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).
В списке pgsql-sql по дате отправления: