ホームページ  >  記事  >  データベース  >  特に MySQL で SQL の循環参照を解決するにはどうすればよいですか?

特に MySQL で SQL の循環参照を解決するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-25 02:19:13337ブラウズ

How Can Circular References in SQL be Resolved, Especially in MySQL?

SQL の循環参照: ジレンマ

リレーショナル データベース設計の領域では、2 つのテーブルがお互いを参考にしますか?残念ながら、その答えは、使用している特定のデータベース管理システム (DBMS) と必要な機能によって異なります。

問題

指定されたデータベース構造の例に示されているように、 2 つのテーブル、products と products_pictures には、循環参照を作成する外部キー制約があります。

products.DEFAULT_PICTURE_ID -> products_pictures.ID
products_pictures.PRODUCT_ID -> products.ID

この循環性特に MySQL で問題が発生する可能性があります。

考えられる解決策

オプション 1: 調整可能な外部キーの Nullability

1 つの解決策外部キー列の 1 つを NULL 可能にすることです。これにより、整合性制約に違反することなく、両方のテーブルへの最初の INSERT が可能になります。ただし、製品に他の製品に属するデフォルトの画像が許可されるなど、データの整合性に関する懸念が生じる可能性があります。この問題に対処するには、外部キー制約を次のように定義できます。

CONSTRAINT FK_products_1 
  FOREIGN KEY (id, default_picture_id) 
  REFERENCES products_pictures (product_id, id)
  ON DELETE RESTRICT
  ON UPDATE RESTRICT

オプション 2: IsDefault Flag

もう 1 つの方法は、次の DEFAULT_PICTURE_ID 列を置き換えることです。 products_pictures テーブルに IsDefault フラグが設定された products テーブル。このソリューションでは、一意の制約またはインデックスを定義して、製品ごとに 1 つの画像のみに IsDefault フラグが true に設定されるようにする必要があります。ただし、MySQL は部分インデックスをサポートしていないため、このアプローチは現実的ではありません。

オプション 3: 遅延可能な制約

このオプションには、遅延可能な制約の使用が含まれます。遅延可能な制約を使用すると、データベースによる整合性制約の適用を一時的に遅らせることができ、テーブルとその関係の初期設定が可能になります。ただし、MySQL は遅延可能な制約をサポートしていません。

オプション 4: 中間テーブル

循環参照を完全に排除するために、3 番目のテーブルを導入できます:

product_default_picture
----------------------
product_id          NOT NULL
default_picture_id  NOT NULL
PRIMARY KEY (product_id)
FOREIGN KEY (product_id, default_picture_id)
  REFERENCES products_pictures (product_id, id)

このアプローチにより循環性が排除され、データが保証されます

MySQL の推奨事項

MySQL の場合、2 つのオプションが引き続き実行可能です:

  • オプション 1: 説明した修正を使用して調整可能な外部キーの null 可能性データの整合性を強制するには、上記を実行します。
  • オプション 4: 回避する中間テーブル循環参照全体。

以上が特に MySQL で SQL の循環参照を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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