Я не вижу созданный мной индекс внешнего ключа - PullRequest
0 голосов
/ 14 марта 2012

Я создал таблицу с уникальным индексом и внешним индексом. Когда я добавляю уникальный ключ, я получаю успешный ответ от 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> 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      |         |               |
+-------------------------------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Во-первых, ограничения внешнего ключа и уникальности не являются индексами, они являются ограничениями.Но для эффективного применения таких ограничений большинство СУБД используют индексы.

В MySQL UNIQUE KEY и UNIQUE INDEX - это одно и то же в определении таблицы, они означают: добавить индекс и ограничение Unique.

Для Foreign Keys ситуация немного другая.В движке InnoDB при добавлении ограничения FOREIGN KEY создается индекс для ссылочных столбцов, но только если индекс еще не существует.

У вас был индекс idx_customer_id_status, который является (customer_id, status) составной индекс, и этот индекс можно использовать для ограничения внешнего ключа.Таким образом, дополнительный индекс не был создан.

1 голос
/ 14 марта 2012

На MySQL земле внешний ключ не является индексом и не будет отображаться в списке индексов.Исходное видение MySQL не включало взаимосвязи таблиц внешних ключей, оно включало только индексы для каждой таблицы для улучшения некоторых улучшений производительности.

InnoDB изначально был сторонним «расширением» (не уверенным в правильности термина в MySQL), которое добавляло менее быстрые, но более совместимые таблицы, которые включали отношения внешнего ключа.Поскольку они никогда не были частью первоначального видения, они никогда не были включены в команды show index или describe table.

Оформление заказа этот старый вопрос о некоторых способах получения списка внешних ключей в таблице.Вы выбираете медленный запрос к information_schema или анализ результатов команды SHOW CREATE TABLE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...