MYSQL: автоматическая индексация внешних ключей

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

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) при удалении, устанавливает значение null при каскаде обновления;

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

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

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

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

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

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

Спасибо

Гиди


person shealtiel    schedule 21.02.2011    source источник
comment
Из любопытства, действительно ли у пользователя, с которым вы подключаетесь через PDO, есть разрешения на создание индексов?   -  person Eric Petroelje    schedule 22.02.2011
comment
Можно ли разрешить пользователю создавать таблицы, но не создавать индексы? Все равно подключаюсь с рутом   -  person shealtiel    schedule 22.02.2011
comment
RE: создание таблиц, но не индексов: да, для этого требуются отдельные привилегии. Обратите внимание, что имя хоста является частью идентичности пользователя; 'root' @ 'localhost' отличается от учетной записи 'root' @ '%'. В зависимости от того, откуда вы подключаетесь, вы можете получить разные привилегии. Попробуйте выполнить команду SHOW GRANTS или SELECT CURRENT_USER() чтобы получить полное имя пользователя.   -  person outis    schedule 22.02.2011
comment
Просто чтобы не упустить очевидное: в таблице users определен первичный ключ, и этот ключ состоит именно из столбца id?   -  person a_horse_with_no_name    schedule 22.02.2011
comment
@a_horse_with_no_name, спасибо за вопрос, у пользователей есть идентификатор в качестве внешнего ключа (единственный внешний ключ)   -  person shealtiel    schedule 22.02.2011
comment
@gidireich: пользователи должны иметь id в качестве первичного ключа, а не внешнего ключа. Если это не первичный ключ, вы не сможете создать ссылающийся на него внешний ключ.   -  person a_horse_with_no_name    schedule 22.02.2011


Ответы (2)


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

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

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

person Dancrumb    schedule 21.02.2011

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

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

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

person Markoorn    schedule 24.05.2017