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
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...' |