MySQL löst die gesetzten Werte für die NEW-Zeile aus und aktualisiert einen anderen in der gleichen Tabelle

7

Ich habe einen Tisch, in dem ich die Gebühren für einen bestimmten Artikel verfolge. Diese Gebühren können sich im Laufe der Zeit ändern, daher habe ich zwei Spalten (startDate, endDate) mit dem aktuellen Gebührensatz, der in der fernen Zukunft immer ein endDate hat. Ich habe bereits einen Trigger, mit dem ich einige Berechnungen für die neue Zeile durchführe, aber was ich auch möchte, ist, wenn ich ein Element eintrage, das bereits einen Eintrag hat, möchte ich das endDate des vorherigen Eintrags auf den Tag vor dem StartDate des neuen Eintrags und das neue endDate auf ein vorbestimmtes entferntes Datum. Hier ist der Code für das, was ich zuerst versucht habe:

%Vor%

Der Fehler, den ich bekomme, ist:

%Vor%     
donbyte 28.06.2012, 15:09
quelle

4 Antworten

10

Die Antwort darauf ist möglicherweise unerwünscht, aber es ist: Sie können das nicht tun.

Ein Trigger kann nicht eine andere Zeile der gleichen Tabelle aktualisieren wie die Zeile, von der der Trigger aufgerufen wurde.

Der typische Weg dahin besteht darin, eine Stored Procedure zu erstellen, die in / in die Zieltabelle einfügt und dann die anderen Zeilen in einer Transaktion aktualisiert.

    
Eugen Rieck 28.06.2012, 15:19
quelle
7

Wenn Sie einen eindeutigen Schlüssel (procKey, EndDate) definiert haben, können Sie vielleicht die zweite Zeile des Triggers entfernen. Entferne auch das fest codierte Datum vom Auslöser.

%Vor%

und machen Sie eine INSERT ON DUPLICATE KEY UPDATE so:

%Vor%

Sie können endDate auch in im.split wie folgt definieren

%Vor%     
RolandoMySQLDBA 28.06.2012 17:06
quelle
2

Ich habe es zum Laufen gebracht, indem ich eine "Wrappertabelle" erstellt habe, die mit den gleichen Feldern wie Ihre Zieltabelle definiert ist, aber mithilfe der Speicher-Engine FEDERATED. Der föderierte Server, den ich definiert habe, um den gleichen mysql-Server anzusprechen, also bei "localhost". Der Trigger, den ich dann gemacht habe, ändert eine Zeile in der Wrapper-Tabelle. Natürlich müssen Sie sehr genau wissen, was Sie im Trigger tun, um eine rekursive Schleife zu vermeiden. Auch möglicherweise ist die Leistung nicht so gut; Ich habe die Leistung nicht getestet, aber sie arbeitet seit Jahren in einer Produktionsumgebung.

    
user3008781 19.11.2013 12:34
quelle
1

Aus den MySQL-Dokumenten :

  

Innerhalb einer gespeicherten Funktion oder eines Triggers ist es nicht erlaubt, a zu ändern   Tabelle, die bereits verwendet wird (zum Lesen oder Schreiben) von der   Anweisung, die die Funktion oder den Trigger aufgerufen hat.

Sie müssen eine andere Möglichkeit finden, das zu tun, was Sie versuchen.

    
Brian Driscoll 28.06.2012 15:19
quelle

Tags und Links