ホームページ >データベース >mysql チュートリアル >同じテーブル内の行の更新における MySQL トリガーの制限を回避するにはどうすればよいですか?

同じテーブル内の行の更新における MySQL トリガーの制限を回避するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-02 19:59:30772ブラウズ

How to Workaround the MySQL Trigger Limitation on Updating Rows in the Same Table?

同じテーブル内の行の更新における 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 サイトの他の関連記事を参照してください。

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