Thread: Sub Select inside Check ?
Hi, I'm trying to create this table with a Check that fails. I'm using 'Check' instead of 'References' due to poor db schema ( before me .. ) Here is my error message: ERROR: cannot use subselect in CHECK constraint expression CREATE TABLE cp_retailers ( ret_id serial PRIMARY KEY, ret_name varchar(120) NOT NULL, ret_address1 varchar(120), ret_address2 varchar(120), sub_id integer NOT NULL CHECK ( EXISTS ( SELECT sub_id FROM suburbs ) ) ); I guess that say's it all - no sub select's in Check or am I on the wrong track ? Thank you kindly Regards Rudi.
Rudi Starcevic wrote: > Hi, > > I'm trying to create this table with a Check that fails. > > I'm using 'Check' instead of 'References' due to poor db schema ( before > me .. ) > > Here is my error message: > ERROR: cannot use subselect in CHECK constraint expression > > CREATE TABLE cp_retailers > ( > ret_id serial PRIMARY KEY, > ret_name varchar(120) NOT NULL, > ret_address1 varchar(120), > ret_address2 varchar(120), > sub_id integer NOT NULL CHECK > ( EXISTS > ( SELECT sub_id FROM suburbs ) > ) > ); > > I guess that say's it all - no sub select's in Check or am I on the > wrong track ? Postgresql 7.3 documentation: "SQL Commands/CREATE TABLE": ...Currently, CHECK expressions cannot contain subselects nor refer to variables other than columns of the current row... Regards, Tomasz Myrta
On Tue, 25 Feb 2003, Rudi Starcevic wrote: > I'm trying to create this table with a Check that fails. > > I'm using 'Check' instead of 'References' due to poor db schema ( before > me .. ) > > Here is my error message: > ERROR: cannot use subselect in CHECK constraint expression > > CREATE TABLE cp_retailers > ( > ret_id serial PRIMARY KEY, > ret_name varchar(120) NOT NULL, > ret_address1 varchar(120), > ret_address2 varchar(120), > sub_id integer NOT NULL CHECK > ( EXISTS > ( SELECT sub_id FROM suburbs ) > ) > ); > > I guess that say's it all - no sub select's in Check or am I on the > wrong track ? Unfortunately, that's not supported (it's non-trivial). If you're looking only for an insert/update on cp_retailers check (ie, suburbs is unlikely to be updated/deleted from), you can do this by hiding the subselect in a function and using that in the check. If you need both direction checks it gets rather complicated to do well, but you can come fairly close using after triggers.