DROP TABLE counters; CREATE TABLE counters ( id integer, data_counters integer DEFAULT 0 ); DROP TABLE data; CREATE TABLE data ( id integer, counters_id integer ); /* RULES */ DROP RULE add_to_data; CREATE RULE add_to_data AS ON insert TO data DO UPDATE counters SET data_counters = data_counters + 1 WHERE id = NEW.counters_id; DROP RULE del_from_data; CREATE RULE del_from_data AS ON delete TO data DO UPDATE counters SET data_counters = data_counters - 1 WHERE id = OLD.counters_id; /* TESTS */ INSERT INTO counters (id) VALUES (1); INSERT INTO data (id,counters_id) VALUES (1,1); INSERT INTO data (id,counters_id) VALUES (2,1); INSERT INTO data (id,counters_id) VALUES (3,1); INSERT INTO data (id,counters_id) VALUES (4,1); SELECT *,'data_counters should be == 4' AS expected FROM counters; /* ---> BUG: Only the first row will be deleted, data_counters will become 3 instead of 0 */ DELETE FROM data WHERE counters_id = 1; SELECT *,'data_counters should be == 0 NOT 3' AS expected FROM counters;