[Sorry if you see this twice; I sent it yesterday and see it in the archives, but never got it in my inbox. --Chris]
On Sun, Nov 16, 2008 at 12:59 PM, Chris Eich <[EMAIL PROTECTED]> wrote: > I have an events table where SET events for a given device_id and > event_code are followed by CLR events. > > CREATE TABLE device_event ( > event_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, > device_id INTEGER NOT NULL REFERENCES device, > event_date INTEGER NOT NULL, > event_code INTEGER NOT NULL REFERENCES event_code, > event_state INTEGER NOT NULL REFERENCES event_state, > event_text TEXT, > exported INTEGER DEFAULT 0, > created_date INTEGER NOT NULL, > event_correlation_id INTEGER > ); > > I want to set event_correlation_id when a CLR is inserted, so that the SET > and CLR events reference each other. > > CREATE TRIGGER update_event_correlation_id AFTER INSERT ON device_event > WHEN new.event_state = 1 > BEGIN > UPDATE device_event SET event_correlation_id = ( > SELECT event_id FROM device_event > WHERE device_id = new.device_id > AND event_code = new.event_code > AND event_state = 2 > ORDER BY event_date DESC LIMIT 1 > ) WHERE event_id = new.event_id; > UPDATE device_event SET event_correlation_id = new.event_id > WHERE event_id = new.event_correlation_id; > END; > > My first version of this trigger failed entirely when I omitted the AFTER > keyword. I wish the default *trigger-time* were documented. > > The second UPDATE in the trigger still fails, though; it seems that the > new record does not get modified by the first UPDATE. If this is true, > perhaps it could also be documented. > > I ended up having to run the SELECT a second time to make the second UPDATE > work: > > CREATE TRIGGER update_event_correlation_id AFTER INSERT ON device_event > WHEN new.event_state = 1 > BEGIN > UPDATE device_event SET event_correlation_id = ( > SELECT event_id FROM device_event > WHERE device_id = new.device_id > AND event_code = new.event_code > AND event_state = 2 > ORDER BY event_date DESC LIMIT 1 > ) WHERE event_id = new.event_id; > UPDATE device_event SET event_correlation_id = new.event_id > WHERE event_id = ( > SELECT event_id FROM device_event > WHERE device_id = new.device_id > AND event_code = new.event_code > AND event_state = 2 > ORDER BY event_date DESC LIMIT 1 > ); > END; > > I am afraid this will get too slow, and can do without the second update > (setting event_correlation_id for the earlier SET event), but I would like > to know if there's a more efficient way to do both. > > Chris > > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users