| From: | Takahiro Noda <noda(dot)takahiro(dot)47m(at)st(dot)kyoto-u(dot)ac(dot)jp> | 
|---|---|
| To: | pgsql-novice(at)postgresql(dot)org | 
| Subject: | Re: The exact timing at which CHECK constraints are checked | 
| Date: | 2011-12-22 06:11:09 | 
| Message-ID: | CAPy7gAo1cAneKYsWG+zGuc3QYeL05Tn-faHRUx2XqYygSkr9fw@mail.gmail.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-novice | 
On Thu, Dec 15, 2011 at 3:41 PM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
> They're checked at the instant that a row is inserted or updated.
> If you really need a deferred check, you'll need to build it yourself
> using an AFTER ROW trigger.
Thank you for taking time to answer my novice question.
The AFTER ROW trigger version is what I expected.
    CREATE TABLE foos (
      bar INTEGER
    );
    CREATE FUNCTION check_foo_cardinality() RETURNS trigger AS $$
      BEGIN
        IF (SELECT count(*) FROM foos) < 1 THEN
          RAISE EXCEPTION 'at least one row required';
        END IF;
        RETURN NULL;
      END
    $$ LANGUAGE plpgsql;
    CREATE CONSTRAINT TRIGGER check_cardinality
      AFTER DELETE ON foos
      INITIALLY DEFERRED
      FOR EACH ROW
      EXECUTE PROCEDURE check_foo_cardinality();
    INSERT INTO foos VALUES (1);
    DELETE FROM foos;  -- => ERROR:  at least one row required
Best,
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Jean-Yves F. Barbier | 2011-12-25 15:16:18 | creating utf-8 random strings | 
| Previous Message | Daniel Northam | 2011-12-21 18:50:04 | TRIGGER FUNCTION - TO CREATE TABLE name AS SELECT |