не можете добавить внешний ключ в MySQL? - PullRequest
13 голосов
/ 22 апреля 2011

Я использовал MySQL Workbench для добавления внешнего ключа в таблицу, но произошла странная ошибка, это оператор SQL:

ALTER TABLE `tansung`.`Declaration` ADD COLUMN `goodsId` INT(11) NOT NULL  AFTER `declarationId` , 
    ADD CONSTRAINT `goodsId`
        FOREIGN KEY (`goodsId` )
        REFERENCES `tansung`.`Goods` (`goodsId` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
    , ADD INDEX `goodsId` (`goodsId` ASC) ;

Когда я нажимаю «Применить», неожиданность появляется!

ERROR 1005: Can't create table 'tansung.#sql-1b10_1' (errno: 150)

SQL Statement:

ALTER TABLE `tansung`.`Declaration` ADD COLUMN `goodsId` INT(11) NOT NULL  AFTER `declarationId` , 
    ADD CONSTRAINT `goodsId`
        FOREIGN KEY (`goodsId` )
        REFERENCES `tansung`.`Goods` (`goodsId` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
    , ADD INDEX `goodsId` (`goodsId` ASC)


ERROR: Error when running failback script. Details follow.


ERROR 1050: Table 'Declaration' already exists

SQL Statement:

CREATE TABLE `Declaration` (
    `declarationId` int(11) NOT NULL,
    PRIMARY KEY (`declarationId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Я не могу обнаружить ошибку в логике, даже не могу понять ошибку, пожалуйста, помогите мне.

Ответы [ 10 ]

16 голосов
/ 21 марта 2012

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

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

10 голосов
/ 22 мая 2013

Это может произойти по многим причинам.Ниже приведены некоторые из распространенных причин.Вы также можете сказать синтаксические ошибки, из-за которых генерируются такие ошибки.

  1. Если механизм таблицы FK (внешний ключ) использует MyISAM, а таблица PK (первичный ключ) Engine являетсяиспользуя InnoDB.MyISAM не поддерживает ограничения внешнего ключа.Таким образом, вы можете преобразовать таблицу ссылок в InnoDB.

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

  3. Если связанные столбцы не имеют точно такой же тип данных (например,INT) и ограничения (УНИКАЛЬНЫЕ и тому подобное), вы получите эту ошибку.

5 голосов
/ 28 сентября 2011

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

Вы можете узнать это из файлов в каталоге базы данных.Таблицы MyISAM будут иметь такие файлы, как:

table_name.frm
table_name.MYD
table_name.MYI

Таблица InnoDB будет просто иметь:

table_name.frm

MyISAM не поддерживает ограничения внешнего ключа.Я бы предложил преобразовать вашу таблицу товаров в InnoDB (хотя, сначала посмотрите документацию и проведите basic research ):

ALTER TABLE Goods ENGINE=INNODB;

После внесения этого изменения моя операция ADD INDEXзавершено успешно.

1 голос
/ 09 мая 2015

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

 CREATE TABLE `something_new` LIKE `something-old`;
 DROP TABLE `something-old`;

YMMV.

1 голос
/ 16 января 2013

Как уже говорили другие, сначала убедитесь, что типы двух столбцов совпадают, и база данных поддерживает это.После этого убедитесь, что столбцы, содержащие ключи к другим таблицам, действительны.У меня была проблема, когда я добавлял ограничение к существующему столбцу с данными в нем, и эти данные не совпадали ни с одним из первичных ключей в другой таблице, поэтому попытка создать связь потерпит неудачу,Чтобы исправить это, нужно обновить все столбцы, чтобы убедиться, что данные моих столбцов соответствуют ограничению, которое я пытался установить.

0 голосов
/ 01 августа 2014

Четвертая возможная проблема (из трех, предложенных abhijitcaps) заключается в том, что вы не сделали столбец, на который ссылаетесь, первичным ключом.

0 голосов
/ 15 июня 2012

Errno 150 имеет много причин.Если у вас есть привилегии SUPER, вы должны попробовать использовать

SHOW ENGINE INNODB STATUS

, и это скажет вам причину.Если у вас нет привилегий SUPER, вам нужно просто пройти через все возможные причины.Вы можете найти, как использовать SHOW INNODB STATUS и список всех причин здесь:

Ошибки внешнего ключа MySQL и Errno 150

0 голосов
/ 20 мая 2012

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

0 голосов
/ 21 апреля 2012

У меня была такая же проблема.Кажется, что в дочерней таблице были некоторые данные, которых нет в родительской таблице.Вы можете выполнить внешнее объединение, чтобы увидеть различия, и вы можете назначить действительный идентификатор для несовпадающих строк или удалить их:

DELETE FROM books
WHERE NOT EXISTS (
    SELECT * FROM users
    WHERE books.user_id = users.id
)
0 голосов
/ 22 апреля 2011

Определения типов Goods.goodsId и Declarations.goodsId должны быть идентичными, иначе вы получите errno: 150.

Убедитесь, что они оба имеют одинаковый тип данных, который выглядит как goodsId INT(11) NOT NULL в таблице Declarations. Что такое оператор CREATE TABLE для Goods?

...