2017-05-24 2 views
0

Ich habe einen Trigger erstellt, um eine Zeile von orders zu löschen, wenn user_id und restaurant_id auf null festgelegt sind.ON LÖSCHEN SET NULL TRIGGER LÖSCHEN

delimiter // 
create trigger order_delete 
before update on orders 
for each row 
if new.user_id is null and new.restaurant_id is null then 
delete from orders where order_id = new.order_id; 
end if; 
// 
delimiter ; 

user_id und restaurant_id sind Fremdschlüssel aus zwei anderen Tabellen und wird auf Null gesetzt werden, wenn sie von ihren jeweiligen Tabellen gelöscht werden. Wenn ich jedoch versuchte, sie aus ihren Tabellen zu löschen, führt sie den Trigger nicht aus. So habe ich noch eine Bestellung mit zwei user_id = NULL und restaurant_id = NULL verbleibenden in meiner Bestellungstabelle. Weiß jemand, warum mein Auslöser nicht auslöst?

+0

Sorry Tippfehler in der ersten Zeile. ".... lösche ** eine Zeile ** von ...." –

+0

Sicherlich hast du die Möglichkeit, deinen Beitrag zu bearbeiten, indem du auf den Link "Bearbeiten" direkt unter dem Fließtext klickst. –

+0

Warum möchten Sie es auf diese Weise machen? IMHO ist es besser, explizit Daten zu löschen, die nicht mehr in der Anwendung benötigt werden, so dass dies (oder nicht in diesem Fall) zu Verwirrung und manchmal unerwünschten Nebenwirkungen führen kann. –

Antwort

1

Wie MySQL-Dokumentation auf foreign keys sagt:

Fremd Kaskadiert Leitaktionen Auslöser

daher nicht aktivieren, keine mtter welche Auslöser Sie schaffen es nicht aufgerufen wird, wenn ein Wert wird über Kaskade auf Null gesetzt.

Wenn Sie einen Datensatz nur löschen möchten, wenn beide Felder auf null gesetzt sind, müssen Sie diese Aktion über den Anwendungscode ausführen. Sie können sich nicht auf die Datenbankautomatisierung verlassen.

Nur eine Randnotiz: Sie sollten keine Bestellungen von Ihrem System löschen, da sie die Grundlage Ihrer finanziellen Transaktionen sind und Sie mit den Steuerbehörden und den externen Wirtschaftsprüfern in Schwierigkeiten geraten können.

+0

Vielen Dank. Große Antwort. –

-1

Sie möchten, dass der Trigger ausgelöst wird, wenn user_id und restaurant_id auf NULL gesetzt sind?

delimiter // 
create trigger order_delete 
after update on orders 
for each row 
if new.user_id is null and new.restaurant_id is null then 
delete from orders where order_id = new.order_id; 
end if; 
// 
delimiter ; 

Mit dem Schlüsselwort after statt before bedeutet, dass der Trigger ausgelöst werden, nachdem die Felder null gesetzt sind:

In diesem Fall sollten Sie verwenden. Unter Verwendung von before wird der Trigger ausgelöst, wenn user_id und restaurant_id immer noch ihre vorherigen Werte haben. In diesem Fall ist die Bedingung in der if-Anweisung niemals wahr.

+0

Kaskadierte Aktionen durch Fremdschlüssel bewirken, dass Trigger in MySQL aktiviert werden. – Shadow