2

多対多のリンクテーブルがあり、その上に2つの外部キーを設定しようとしています。私はこれらの2つのステートメントを実行します:

ALTER TABLE address_list_memberships
ADD CONSTRAINT fk_address_list_memberships_address_id
FOREIGN KEY index_address_id (address_id)
REFERENCES addresses (id);

ALTER TABLE address_list_memberships
ADD CONSTRAINT fk_address_list_memberships_list_id
FOREIGN KEY index_list_id (list_id)
REFERENCES lists (id);

実行すると、次のように表示されるSHOW CREATE TABLE address_list_membershipsと思います。

[...]
KEY `index_address_id` (`address_id`),
KEY `index_list_id` (`list_id`),
CONSTRAINT `fk_address_list_memberships_list_id` FOREIGN KEY (`list_id`) 
    REFERENCES `lists` (`id`),
CONSTRAINT `fk_address_list_memberships_address_id` FOREIGN KEY (`address_id`) 
    REFERENCES `addresses` (`id`)

しかし、代わりに私はこれを取得します:

[...]
KEY `index_list_id` (`list_id`),
CONSTRAINT `fk_address_list_memberships_list_id` FOREIGN KEY (`list_id`) 
    REFERENCES `lists` (`id`),
CONSTRAINT `fk_address_list_memberships_address_id` FOREIGN KEY (`address_id`) 
    REFERENCES `addresses` (`id`)

インデックスが1つしかないように見えます。外部キーを作成するたびにMySQLが参照列にインデックスを自動的に作成するというMySQLのドキュメントと矛盾しているようです。

CocoaMySQLやSQLyogなどのGUIツールを使用するか、コマンドラインで実行するかにかかわらず、テーブルに2つのFKを作成するたびに、この1つのインデックスのみに気づきました。

この謎の照明は非常にありがたいです。

4

2 に答える 2

2

私はそれを試してみましたが、私にとってはうまくいきます。ALTERあなたが書いたステートメントをコピーして貼り付けたところ、次のようになりました。

mysql> show create table address_list_memberships;

CREATE TABLE `address_list_memberships` (
  `address_id` bigint(20) unsigned NOT NULL,
  `list_id` bigint(20) unsigned NOT NULL,
  KEY `index_address_id` (`address_id`),
  KEY `index_list_id` (`list_id`),
  CONSTRAINT `fk_address_list_memberships_list_id` 
    FOREIGN KEY (`list_id`) REFERENCES `lists` (`id`),
  CONSTRAINT `fk_address_list_memberships_address_id` 
    FOREIGN KEY (`address_id`) REFERENCES `addresses` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Mac OS X で MySQL 5.0.51a を使用しています。

編集: MySQL がテーブルに存在すると考える すべてのインデックスを取得するには、次のクエリを試してください。

SELECT * FROM information_schema.key_column_usage 
WHERE table_schema = 'test' AND table_name = 'address_list_memberships'\G

(テストには「test」データベースを使用しました。この文字列を、テーブルが定義されているスキーマの名前に置き換える必要があります。)

于 2008-11-25T00:59:48.607 に答える
0

それは本当に問題ではありません。list_id にはまだインデックスがあります。MySQL では、外部キー制約が参照フィールドにもインデックスを持つ必要があります。index_list_id と fk_address_list_memberships_list_id の両方が list_id に基づいて構築されているため、MySQL はおそらくこれを認識し、index_list_id をインデックスとして使用し、名前を fk_address_list_memberships_list_id に変更します。MySQL は使用しているバージョンで暗黙的にインデックスを宣言するため、インデックスの宣言をスキップすることもできます。

于 2009-07-12T14:08:40.450 に答える