2010-07-12 13 views
5

Ich arbeite an der Einrichtung einer einfachen SQLite-Datenbank für den Zugriff über Python. Bis jetzt habe ich eine Basistabelle und ein paar Auslöser - ich möchte einen Auslöser eine Feldspalte 'date_added' aktualisieren, wenn ein neuer Datensatz hinzugefügt wird, und einen anderen, um eine Spalte 'date_updated' zu aktualisieren, wenn ein Datensatz später aktualisiert wird . Hier ist meine SQLite Syntax für die Trigger:sqlite UPDATE Trigger Feuern auf INSERT-Anweisungen auch?

CREATE TRIGGER add_contact AFTER INSERT ON contact_info 
BEGIN 
    UPDATE contact_info SET date_added = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

CREATE TRIGGER update_contact AFTER UPDATE ON contact_info 
BEGIN 
    UPDATE contact_info SET date_updated = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

Der ‚add_contact‘ Trigger scheint zu funktionieren ... es feuert, wenn ich einen neuen Datensatz über einen SQL-Befehl INSERT hinzufügen, wie geplant.

Das Problem scheint die ‚update_contact‘ Trigger zu sein ... es feuert beide, wenn ich einen Datensatz über einen SQL-Befehl UPDATE aktualisieren (wie geplant) und, wenn ich einen neuen Datensatz hinzufügen auch:

dh wenn ich einen neuen Datensatz hinzufügen bekomme ich diese in den ‚DATE_ADDED‘ und ‚date_updated‘ Spalten:

2010-07-12 05:00:06|2010-07-12 05:00:06 

und wenn ich diesen Rekord aktualisieren, es ändert sich wie folgt:

2010-07-12 05:00:06|2010-07-12 05:14:26 

Ich denke, ich verstehe nicht, warum der UPDATE-Trigger auch bei INSERT ausgelöst wird.

TIA,

Monte

Edited hinzufügen: Irgendwelche Hinweise, wie sie wie beabsichtigt funktioniert?

Antwort

6

Sie haben ein UPDATE in Ihrem INSERT-Trigger. Das INSERT verursacht also ein UPDATE. Was du mit einem anderen Auslöser angehakt hast.

+0

Whoops! Ich sehe, was du meinst;) Irgendeine Idee, wie man die ursprünglichen Ziele von zwei verschiedenen Auslösern erreicht, einer, der auf einem INSERT feuert, und einem, der auf UPDATE feuert? Scheint so, als ob es eine Möglichkeit gäbe, den Auslöser 'update_contact' bei der Aktualisierung eines Feldes auszulösen * außer * date_added, das sollte es tun. Nur nicht sicher, wie es geht ... – memilanuk

+1

@memilanuk: Sie könnten OLD.date_added mit NEW.date_added in Ihrem UPDATE-Trigger vergleichen? – Borealid

+1

Nur ein Update auf einen alten Thread, als ich heute wieder mit dem fraglichen Code herumgebastelt habe. Ich änderte den Auslösercode zu lesen: UPDATE contact_info SET date_updated = DATETIME ('JETZT') WHERE pkid = new.pkid UND DATETIME ('NOW')! = Date_added; Scheint zu arbeiten. Danke für den Anstoss in die richtige Richtung! – memilanuk

8

Eine bessere Möglichkeit, das ursprüngliche Problem zu vermeiden, ist die Verwendung einer DEFAULT (DATETIME('NOW')) -Klausel für die date_added-Spalte in der Tabellendefinition anstelle der Verwendung eines INSERT-Triggers.

+2

Und stellen Sie sicher, dass * no * INSERT-Anweisungen die Spalte date_added enthalten. SQLite3 scheint DEFAULT-Klauseln nicht auszuführen, wenn NULL für eine bestimmte Spalte eingefügt wird. –