I would like to add a constraint that will check values from related table.
I have 3 tables:
CREATE TABLE somethink_usr_rel (
user_id BIGINT NOT NULL,
stomethink_id BIGINT NOT NULL
);
CREATE TABLE usr (
id BIGINT NOT NULL,
role_id BIGINT NOT NULL
);
CREATE TABLE role (
id BIGINT NOT NULL,
type BIGINT NOT NULL
);
(If you want me to put constraint with FK let me know.)
I want to add a constraint to somethink_usr_rel that checks type in role ("two tables away"), e.g.:
ALTER TABLE somethink_usr_rel
ADD CONSTRAINT CH_sm_usr_type_check
CHECK (usr.role.type = 'SOME_ENUM');
I tried to do this with JOINs but didn't succeed. Any idea how to achieve it?
CHECKconstraints cannot currently reference other tables. The manual:One way is to use a trigger like demonstrated by @Wolph.
A clean solution without triggers: add redundant columns and include them in
FOREIGN KEYconstraints, which are the first choice to enforce referential integrity. Related answer on dba.SE with detailed instructions:Another option would be to "fake" an
IMMUTABLEfunction doing the check and use that in aCHECKconstraint. Postgres will allow this, but be aware of possible caveats. Best make that aNOT VALIDconstraint. See: