2012-04-11 2 views
2

Использование двигателя по умолчанию (MyISAM), я могу создать внешний ключ с этим синтаксисом:Mysql, InnoDB - Невозможно создать внешний ключ

alter table `codes` add constraint foreign key(`associated_code_id`) references ask_codes(code_id) on update cascade on delete cascade; 

Однако, когда я создать таблицу с помощью InnoDB Я больше не могу создать внешний ключ (mysql дает мне ERROR 1005 (HY000): не удается создать таблицу 'my_table. # Sql-3311_16115' (errno: 150)).

Является ли это проблемой синтаксиса? Спасибо за помощь,

+0

Согласно документам: невозможно создать таблицу. Если сообщение об ошибке относится к ошибке 150, создание таблицы завершилось неудачно, потому что ограничение внешнего ключа было неправильно сформировано. – rix

ответ

6

Вы проблема заключается в том, что обе колонки дон т»имеют один и тот же тип - они не соответствуют точно:

Если вы заново создать таблицу, которая была сброшена, она должна иметь определение , которая соответствует внешнему ключу, ссылающихся его. Он должен иметь имена и типы правильного столбца, и он должен иметь индексы на ссылочных ключах , как указано ранее. Если они не выполнены, MySQL возвращает номер ошибки 1005 и ссылается на ошибку 150 в сообщении об ошибке .

+0

Да спасибо. Нужный индекс (col_name) для обоих противопоказаний и точное совпадение в temrs типа ... – rix

-5

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

+0

Другой путь. MyISAM не поддерживает ограничения FK. – nnichols

+1

Нет. InnoDB поддерживает FK - http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html – Timur

0

Когда вы запускаете инструкцию ALTER для таблицы MyISAM, она молча игнорирует ограничение FK, если я правильно помню. Когда вы запускаете его для InnoDB, он пытается проверить ограничение, применив его к таблице. Я думаю, что эта ошибка возникает, когда ограничение FK терпит неудачу для существующей строки - InnoDB Error Codes

Вы можете попробовать следующий запрос, чтобы увидеть, какие значения блокирует создание ограничений -

SELECT * 
FROM codes 
LEFT JOIN ask_codes 
    ON codes.associated_code_id = ask_codes.code_id 
WHERE ask_codes.code_id IS NULL 
+0

Спасибо за помощь - обе таблицы EMPTY, поэтому этот запрос пока действительный ничего не возвращает! – rix

+0

@rix - В этом случае это, вероятно, потому, что ask_codes является таблицей MyISAM или существует несоответствие типа данных. Это должен быть InnoDB, и оба поля должны иметь один и тот же тип данных. – nnichols

1

добавить к @ phpGeek здорово ответ, который также вам нужно иметь одинаковую длину в числовые значения, это означает, что, если таблица А имеет «ID INT (11)» таблица B должны иметь «a_id INT (11)» в Что ж.

Смежные вопросы