trigger/refint question..

From: Michael J Schout <mschout(at)gkg(dot)net>
To: pgsql-sql(at)postgresql(dot)org
Subject: trigger/refint question..
Date: 2000-06-08 17:49:10
Message-ID: Pine.LNX.4.10.10006081225260.14605-100000@galaxy.gkg-com.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Hi.

Im trying to implement a referential integrity check that I suspect there
is a much better way to do that what I have done. Basically what I have is
a "order" table and a "order items" table. I would like to make it so that
if all items are removed from the order, then the corresponding "order"
entry is removed.

e.g.:

CREATE TABLE orders (
id SERIAL,
dname TEXT NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE order_items (
item_id SERIAL,
order_id INT NOT NULL,
item VARCHAR(80) NOT NULL,
PRIMARY KEY (item_id)
);

BEGIN;
INSERT INTO orders (dname) VALUES ('FOO');
INSERT INTO order_items (order_id, item)
VALUES (CURRVAL('orders_id_seq'), 'FOO ITEM #1');
INSERT INTO order_items (order_id, item)
VALUES (CURRVAL('orders_id_seq'), 'FOO ITEM #2');

INSERT INTO orders (dname) VALUES ('BAR');
INSERT INTO order_items (order_id, item)
VALUES (CURRVAL('orders_id_seq'), 'BAR ITEM #1');
INSERT INTO order_items (order_id, item)
VALUES (CURRVAL('orders_id_seq'), 'BAR ITEM #2');
COMMIT;

So we have 2 orders, each with 2 items in it. Suppose someone later comes
along and deletes all of the items in the order:

DELETE FROM order_items
WHERE order_id=1;

Ideally, I would like a trigger (or something similar) to fire after this
delete runs that does something like:

DELETE FROM orders
WHERE id IN (
SELECT id
FROM orders o
WHERE NOT EXISTS (SELECT 1 FROM order_items WHERE order_id=o.id)
);

(sort of the invers of "FOREIGN KEY (...) REFERENCES (..) ON DELETE CASCADE").

The trick seem sto be getting this into a function somehow. The delete
query does not return a value, so I am not sure how to go about doing that.

Assuming I *could* get this into an sql or plpgsql function somehow, I could
simply do:

CREATE TRIGGER tr_order_items_del AFTER DELETE ON order_items
FOR EACH ROW EXECUTE PROCEDURE del_order_items();

And I think that would solve my problem.

Am I making this overly complicated? Is there an easier way? If not,
then does anyone have any ideas how I can make this work?

Thanks.

Mike

Browse pgsql-sql by date

  From Date Subject
Next Message Hiroshi Inoue 2000-06-08 18:01:50 RE: Problem with subquery in CHECK constraint.
Previous Message Bernie Huang 2000-06-08 17:01:04 SQL 'Case When...'