MYSQL изменить таблицу - добавить INDEX + FOREIGN KEY дать ошибку 1005 - PullRequest
2 голосов
/ 11 августа 2010

что не так с этой командой alter table:

ALTER TABLE `lp` 
ADD COLUMN `RuleId` INT(10) NOT NULL DEFAULT -111 AFTER `Weight` , , 
ADD CONSTRAINT `fk_1` FOREIGN KEY (`RuleId` ) REFERENCES `Rules` (`RuleId` ) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD INDEX `fk_1` (`RuleId` ASC) ;

если я отброшу строку

  ADD CONSTRAINT `fk_1` FOREIGN KEY (`RuleId` ) REFERENCES `Rules` (`RuleId` ) ON DELETE NO ...

ее работа,

ошибка, которую я получаю:

Error Code : 1005
Can't create table '..' (errno: 121)

как добавить иностранный ключ и указатель на одно поле ?

Обновление:

Я пытаюсь разделить на 2 запроса, сначала добавить INDEX, а затем добавить FOREIGN KEY, индекс добавлен, но второй запрос не работает!

, когда я изменяю имя внешнего ключа (например, 'fk_2') и пытаюсь запустить его, я получаю сообщение об ошибке: Код ошибки: 1452 Не удается добавить или обновитьдочерняя строка: ограничение внешнего ключа не выполняется

Ответы [ 3 ]

5 голосов
/ 11 августа 2010

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

1 голос
/ 25 февраля 2011

У меня была точно такая же проблема.

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

ОШИБКА 1005 (HY000): невозможно создать таблицу './MyDB/#sql-e4a_c715.frm' (номер ошибки: 121) Как упоминалось выше, вы получите это сообщение, если попытаетесь добавить ограничение с именем, которое уже используется где-то еще.

(взято с здесь )

Так что просто переименуйте его во что-нибудь случайное, чтобы проверить, правильно ли я ..

0 голосов
/ 06 марта 2014

Я получил эту ошибку после объединения DDL-файлов схемы из N приложений Django с помощью команды manage.py sqlall.

Я обнаружил, что DDL MySQL требует, чтобы операторы были сгруппированы по kind в этом порядке. В частности, все ALTER TABLE ... ADD ... FOREIGN KEY ... должны быть последними, иначе MySQL выдаст эту ошибку.

  1. CREATE TABLE ...
  2. СОЗДАТЬ ИНДЕКС ...
  3. ALTER TABLE table_name ADD CONSTRAINT name FOREIGN KEY ...
...