ホームページ  >  記事  >  データベース  >  MySQL に新しい行を挿入した後に同じテーブル内の行を更新するにはどうすればよいですか?

MySQL に新しい行を挿入した後に同じテーブル内の行を更新するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-30 06:58:18794ブラウズ

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

MySQL トリガー: 新しい行の値の設定と同じテーブル内の別の行の更新

MySQL では、トリガーは次のことを可能にする強力なメカニズムです。テーブル内で特定のイベントが発生したときに特定のアクションを実行します。一般的な使用例の 1 つは、新しく挿入された行 (NEW) の値を設定しながら、同じテーブル内の別の行を更新することです。ただし、この操作を試行すると、一般的なエラーが発生する可能性があります:

エラー 1442: このストアド関数/トリガーを呼び出したステートメントによってすでに使用されているため、ストアド関数/トリガーのテーブル 'split' を更新できません。

このエラーは、トリガーがトリガーされたテーブルと同じテーブルを更新できないために発生します。この制限を克服するには、次の代替アプローチに従ってください:

ストアド プロシージャの使用:

トリガーを使用する代わりに、挿入および更新操作を処理するストアド プロシージャを作成します。次に例を示します。

<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>

プロシージャの使用法:

ストアド プロシージャを呼び出すには、次のコマンドを実行します。

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

このストアド プロシージャこのアプローチを使用すると、単一のトランザクション コンテキストで目的の操作を実行でき、トリガーを使用して呼び出し元と同じテーブルを更新するときに発生するエラーを回避できます。

以上がMySQL に新しい行を挿入した後に同じテーブル内の行を更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。