MariaDB(およびおそらくMySQL)が外部キーでもある複合一意インデックスをどのように処理するかについて、問題が発生する可能性があります。それが仕様によるものかどうか、そうである場合、なぜそのように機能するのかはわかりません。
Action_contactというテーブルがあります。 「action」テーブルへの外部キーaction_idと「contact」テーブルへのcontact_idがあります。どちらも符号なしbigint列です。これら2つのフィールドも一意のインデックスにする必要があります。一意のインデックスを追加しない場合、デフォルトでは両方のフィールドがデータベースのインデックスでもありますが、問題ありません。ただし、一意の複合インデックス(action_id、contact_id)を追加すると、データベースに追加されますが、contact_idの通常のインデックスは引き続き存在し、action_idの通常のインデックスは削除されます。外部キーは存在するはずですが、まだ存在しています。これは正常な動作ですか?
これは 文書化された動作 :
MySQLは外部キーと参照されたキーのインデックスを必要とするため、外部キーチェックは高速で、テーブルスキャンを必要としません。参照テーブルには、外部キー列が同じ順序で最初の列としてリストされているインデックスが必要です。このようなインデックスは、存在しない場合、参照テーブルに自動的に作成されます。外部キー制約を適用するために使用できる別のインデックスを作成すると、このインデックスは後で黙って削除される可能性があります。 index_nameが指定されている場合は、前述のように使用されます。
同じ列に対する複数のインデックスが許可されますが、非推奨であり(冗長であるため、一意でないキーが一意のインデックスで実行できないことはほとんどありません)、将来的にエラーになる可能性があります(ただし、別のインデックスではできません)この場合のようなタイプ)。
混乱を避けるために、最初から一意のインデックス(またはカスタム名で適切な明示的なインデックス)を作成することをお勧めします。これは混乱する可能性があるので、私はあなたに同意します。したがって、マニュアルを見るのは常に素晴らしいアイデアであり、現在の実装は、制御と最適化の観点の間の妥協点から理にかなっていると思います。 :-)