2012-03-14 10 views
0

私はユニークインデックスと外部インデックスを持つテーブルを作成しました。私がユニークなキーを追加すると、MySQLからの成功応答が得られます。その後、私は外来のキーを追加すると、私はまた、成功の応答を取得します。ここで私が作成した外部キ​​ーインデックスが表示されません

は、外部キーを追加するためのSQLです:

ALTER TABLE `rewards_customer_index_points` 
ADD CONSTRAINT FOREIGN KEY FK_CUSTOMER_INDEX_POINTS_CUSTOMER_ID( `customer_id`) 
REFERENCES `customer_entity` ( `entity_id`) 
ON DELETE CASCADE 
ON UPDATE CASCADE 

しかし、私はテーブルの上にその外部キーが表示されませんので、それが正常に作成されていないように思えます。しかし、間違いなくそこにあるのは、参照されたcustomer_entityレコードを削除するとカスケードが動作することです。

なぜインデックスリストに表示されないのですか?どちらのテーブルもInnoDBです。ここで

がテーブルの上にテーブル構造とキーです:MySQL土地で

mysql> explain rewards_customer_index_points; 
+-----------------+------------------+------+-----+-------------------+-----------------------------+ 
| Field   | Type    | Null | Key | Default   | Extra       | 
+-----------------+------------------+------+-----+-------------------+-----------------------------+ 
| index_points_id | int(10) unsigned | NO | PRI | NULL    | auto_increment    | 
| customer_id  | int(10) unsigned | NO | MUL | NULL    |        | 
| status   | int(11)   | NO |  | 0     |        | 
| points_positive | int(11)   | NO |  | NULL    |        | 
| points_negative | int(11)   | NO |  | NULL    |        | 
| updated_at  | timestamp  | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+-----------------+------------------+------+-----+-------------------+-----------------------------+ 


show index from rewards_customer_index_points; 
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table       | Non_unique | Key_name    | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment  | Index_comment | 
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| rewards_customer_index_points |   0 | PRIMARY    |   1 | index_points_id | A   |   2 |  NULL | NULL |  | BTREE  |   |    | 
| rewards_customer_index_points |   0 | idx_customer_id_status |   1 | customer_id  | A   |   2 |  NULL | NULL |  | BTREE  |   |    | 
| rewards_customer_index_points |   0 | idx_customer_id_status |   2 | status   | A   |   2 |  NULL | NULL |  | BTREE  |   |    | 
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
+1

おそらく、あなたのテーブルはInnoDBテーブルではありません。 参照:私はこれを含めるように計画していたhttp://stackoverflow.com/questions/8960418/foreign-key-between-mysql-innodb-tables-not-working-why/8960483#8960483 –

+0

おかげローランド、申し訳ありません最初の投稿では忘れてしまったので、今編集しています。両方のテーブルは、実際にInnoDBです。 – kalenjordan

+2

外部キーが作成されたかどうかを確認するためにSHOW CREATE TABLLEを実行してください。 –

答えて

1

外部キーがインデックスではなく、インデックスのリストには表示されません。 MySQLのオリジナルのビジョンには、外部キーテーブルの関係は含まれていませんでした。選択されたパフォーマンス改善を改善するためのテーブルごとのインデックスのみが含まれていました。

InnoDBはもともと外部キーの関係を含んでいない、高速ではなくより適合性の高いテーブルを追加したサードパーティの「拡張機能」(MySQLの話し言葉には適切なものではない)です。それらは元のビジョンの一部ではなかったので、show indexまたはdescribe tableコマンドには組み込まれませんでした。

チェックアウトthis older questionテーブルの外部キーのリストを取得する方法はいくつかあります。あなたの選択はinformation_schemaへの遅いクエリか、SHOW CREATE TABLEコマンドの結果の解析です。

+1

私はあなたが言うほとんどすべてに同意しますが、どの土地でインデックスと同じ「FOREIGN KEY」制約がありますか?これら2つのコンセプトが混在する土地が1つあれば、それはMySQLです。 –

2

最初に、外部キー制約と固有制約はインデックスではなく、制約条件です。しかし、このような制約を効果的に実施するために、ほとんどのDBMSではインデックスを使用します。

MySQLでは、UNIQUE KEYUNIQUE INDEXはテーブル定義内で同じものです。つまり、インデックスとユニーク制約を追加するという意味です。

外国キーの場合、状況は少し異なります。 InnoDBエンジンでは、FOREIGN KEY制約を追加すると、インデックスがまだ存在しない場合にのみ、参照元カラムのインデックスが作成されます。

(customer_id, status)複合インデックスであるidx_customer_id_statusインデックスがあり、このインデックスを外部キー制約に使用できます。したがって、追加の索引は作成されませんでした。

+0

ありがとう@ypercube!私は、外部キー制約によって作成されるインデックスは、制約と同じ正確な名前を持っていると思いますが(それは本当に理にかなっていますが)、私は外来キー制約が間違いなくインデックスと同じです。 – kalenjordan

+0

いいえ、投稿したものから、 'customer_id'だけにインデックスはありません。コンパウンド索引はFKに使用されます。 –

関連する問題