Re: Check/unique constraint question - Mailing list pgsql-sql

From Volkan YAZICI
Subject Re: Check/unique constraint question
Date
Msg-id 20060305100526.GA214@alamut
Whole thread Raw
In response to Re: Check/unique constraint question  ("Nikolay Samokhvalov" <samokhvalov@gmail.com>)
List pgsql-sql
On Mar 05 12:02, Nikolay Samokhvalov wrote:
> Unfortunately, at the moment Postgres doesn't support subqueries in
> CHECK constraints

I don't know how feasible this is but, it's possible to hide subqueries
that will be used in constraints in procedures. Here's an alternative
method to Nikolay's:

CREATE TABLE where_check (active bool, id int);

CREATE OR REPLACE FUNCTION check_id (bool, int) RETURNS bool AS ' SELECT CASE   WHEN $1 THEN NOT EXISTS (SELECT 1
                    FROM where_check AS W                            WHERE W.active IS TRUE AND W.id = $2)   ELSE TRUE
END;
' LANGUAGE SQL;

-- A partial index like
-- CREATE INDEX active_id_idx ON where_check (id)
--   WHERE active IS TRUE;
-- should speed up above query

ALTER TABLE where_check ADD CONSTRAINT idchk CHECK (check_id(active, id));

test=# INSERT INTO where_check VALUES (TRUE, 2);
INSERT 0 1
test=# INSERT INTO where_check VALUES (FALSE, 2);
INSERT 0 1
test=# INSERT INTO where_check VALUES (TRUE, 2);
ERROR:  new row for relation "where_check" violates check constraint
"idchk"


Regards.


pgsql-sql by date:

Previous
From: "Nikolay Samokhvalov"
Date:
Subject: Re: Check/unique constraint question
Next
From: Michael Glaesemann
Date:
Subject: Re: Check/unique constraint question