MYSQL: автоматическая индексация внешних ключей - PullRequest
3 голосов
/ 22 февраля 2011

Нижеследующий набор команд:

alter table opportunities add column ownerId int null;
alter table opportunities add foreign key (ownerId) references users (id) on delete set null on update cascade;

Выдает ошибку, подобную этой:

Ошибка в ограничении внешнего ключа таблицы taous / # sql-318c_27: В таблице "taous" нет индекса. "# Sql-318c_27", где отображаются столбцы в качестве первых столбцов. Ограничение: внешний ключ (ownerId) ссылается на пользователей (id) при удалении, устанавливает ноль при обновлении ;

Итак, я понимаю, что для указанного столбца отсутствует индекс

Теперь документация mysql для ограничений внешнего ключа гласит:

InnoDB требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как столбцы first в том же порядке. Такой индекс создается в ссылочной таблице автоматически, если он не существует. (Это отличается от некоторых более старых версий, в которых индексы должны были создаваться явно, или создание ограничений внешнего ключа не удавалось.) index_name, если дано, используется, как описано ранее.

Я запускаю mysql 5.1 (xampp, windows), поэтому я ожидаю, что столбцы будут автоматически проиндексированы при создании внешнего ключа.

Есть идеи, почему может произойти сбой автоматической индексации?

Еще один момент: Ошибка происходит только тогда, когда команды sql запускаются через PDO (инструмент обновления базы данных). При запуске напрямую в консоли mysql проблем нет.

Спасибо

Gidi

Ответы [ 2 ]

0 голосов
/ 24 мая 2017

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

Например, если столбец ownerId таблицы opportunities равен INT но Id столбец users - это любой тип, отличный от INT

Это не объясняет, почему он будет работать с консолью, а не с PDO, но, возможно, это поможет кому-то ещевниз по линии.

0 голосов
/ 22 февраля 2011

Насколько я понимаю, автоиндексация выполняется для ссылки на таблицу , а не для ссылки таблицы.

В вашем случае автоматическая индексация добавит индекс к ownerId в opportunities ... за исключением того, что в этом нет необходимости, поскольку вы уже сделали это.

Я не совсем понимаю, откуда взято "taous"."#sql-318c_27", но, предполагая, что оно относится к таблице users, я полагаю, что ошибка жалуется на то, что id не проиндексирован.

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