Heim >Datenbank >MySQL-Tutorial >Wie aktualisiere ich eine Zeile in derselben Tabelle, nachdem ich eine neue Zeile in MySQL eingefügt habe?

Wie aktualisiere ich eine Zeile in derselben Tabelle, nachdem ich eine neue Zeile in MySQL eingefügt habe?

Linda Hamilton
Linda HamiltonOriginal
2024-10-30 06:58:18862Durchsuche

How to Update a Row in the Same Table after Inserting a New Row in MySQL?

MySQL-Trigger: Werte für NEUE Zeile festlegen und eine andere in derselben Tabelle aktualisieren

In MySQL sind Trigger leistungsstarke Mechanismen, die es Ihnen ermöglichen Führen Sie bestimmte Aktionen aus, wenn bestimmte Ereignisse in einer Tabelle auftreten. Ein häufiger Anwendungsfall besteht darin, Werte für die neu eingefügte Zeile (NEW) festzulegen und gleichzeitig eine andere Zeile in derselben Tabelle zu aktualisieren. Beim Versuch dieses Vorgangs kann jedoch ein häufiger Fehler auftreten:

FEHLER 1442: Die Tabelle „Split“ in der gespeicherten Funktion/dem gespeicherten Trigger kann nicht aktualisiert werden, da sie bereits von der Anweisung verwendet wird, die diese gespeicherte Funktion/diesen gespeicherten Trigger aufgerufen hat.

Dieser Fehler tritt auf, weil ein Trigger nicht dieselbe Tabelle aktualisieren kann, von der aus er ausgelöst wurde. Um diese Einschränkung zu überwinden, folgen Sie diesem alternativen Ansatz:

Verwenden einer gespeicherten Prozedur:

Anstatt einen Trigger zu verwenden, erstellen Sie eine gespeicherte Prozedur, die die Einfüge- und Aktualisierungsvorgänge verarbeitet. Hier ist ein Beispiel:

<code class="sql">DELIMITER $$
CREATE PROCEDURE split_before_ins(IN startDate DATE, IN endDate DATE, IN tcOfficeFee DECIMAL, IN globalFee DECIMAL)
BEGIN
  -- Insert a new row with the provided parameters
  INSERT INTO im.split (startDate, endDate, tcOfficeFee, globalFee)
  VALUES (startDate, endDate, tcOfficeFee, globalFee);
  
  -- Update the previous row's endDate
  UPDATE im.split
  SET endDate = DATE_SUB(startDate, INTERVAL 1 DAY)
  WHERE procKey = (SELECT procKey FROM im.split ORDER BY procKey DESC LIMIT 1)
  AND endDate = '20501231';
END$$
DELIMITER ;</code>

Prozedurverwendung:

Um die gespeicherte Prozedur aufzurufen, führen Sie Folgendes aus:

<code class="sql">CALL split_before_ins('2023-01-01', '2024-12-31', 10.00, 100.00);</code>

Diese gespeicherte Prozedur Mit diesem Ansatz können Sie die gewünschten Vorgänge in einem einzigen Transaktionskontext ausführen und so den Fehler vermeiden, der auftritt, wenn ein Trigger verwendet wird, um dieselbe Tabelle zu aktualisieren, von der aus er aufgerufen wurde.

Das obige ist der detaillierte Inhalt vonWie aktualisiere ich eine Zeile in derselben Tabelle, nachdem ich eine neue Zeile in MySQL eingefügt habe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn