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 サイトの他の関連記事を参照してください。