ホームページ >データベース >mysql チュートリアル >同じテーブル内の行の更新における MySQL トリガーの制限を回避するにはどうすればよいですか?
同じテーブル内の行の更新における MySQL トリガーの制限の回避策
MySQL では、トリガーが割り当てられている同じテーブル内の行を更新できないため、永続的な制限でした。トリガーがデータ操作において重要な役割を果たすため、この制限は問題となる可能性があります。ただし、このハードルを克服するための回避策があります。
推奨される回避策
1.ストアド プロシージャの呼び出し:
元の質問で述べたように、目的のロジックをカプセル化するストアド プロシージャを呼び出すことが一般的な回避策です。これにより、トリガーが実際のデータベース操作から分離され、再帰の問題が回避されます。
2.一時テーブルの使用:
もう 1 つの方法では、トリガーによって変更されるデータを保持する一時テーブルを作成します。その後、トリガーはこの一時テーブルを更新し、その後元のテーブルにマージし直すことができます。
3.代替列の更新:
可能な場合、トリガーは、トリガー定義で参照されている列の代わりに、同じテーブル内の代替列を更新できます。これにより、トリガーは制限に違反することなくテーブルを変更できます。
4.カスケード トリガーの利用:
カスケード トリガーの作成はより複雑なソリューションになる可能性がありますが、同じテーブル内で更新を実行する方法を提供できます。異なる優先レベルを持つ複数のトリガーを設定することで、制御された方法で更新を実行できます。
一時テーブルを使用した例
元の質問で提供された例を検討してください。ここで、トリガーは同じテーブルに新しいレコードを挿入する必要があります。一時テーブルの回避策を備えた次のトリガーを使用できます。
<code class="sql">CREATE TRIGGER insert_product_attributes BEFORE INSERT ON products FOR EACH ROW BEGIN DECLARE tmp_table_name CHAR(64); SET tmp_table_name = CONCAT("_tmp_", UUID()); CREATE TEMPORARY TABLE tmp_table_name ( product_id INT, attribute_id INT, value VARCHAR(255) ); INSERT INTO tmp_table_name (product_id, attribute_id, value) SELECT new.id, child_attribute.id, child_attribute.default_value FROM child_products INNER JOIN child_attributes ON child_products.parent_product_id = new.id; INSERT INTO product_attributes SELECT * FROM tmp_table_name; DROP TEMPORARY TABLE tmp_table_name; END;</code>
結論
同じテーブル内の行を更新するトリガーに対する MySQL の制限は困難な場合がありますが、上で説明した回避策は実用的な解決策を提供します。ストアド プロシージャ、一時テーブル、代替列更新、またはカスケード トリガーを活用することで、データベース管理者はこの制限を克服し、効果的なデータ操作戦略を実装できます。
以上が同じテーブル内の行の更新における MySQL トリガーの制限を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。