Не может добавить внешний ключ в mysql?

Я использовал workbench MySQL для добавления внешнего ключа в таблицу, но произошла какая-то странная ошибка, это оператор 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) ;

Когда я нажимаю кнопку Apply, неожиданно появляется!

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

table_name.frm
table_name.MYD
table_name.MYI

В таблице InnoDB будет только:

table_name.frm

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

ALTER TABLE Goods ENGINE=INNODB;

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

Ответ 4

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

Ответ 5

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

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

YMMV.

Ответ 6

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

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

Ответ 7

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

DELETE FROM books
WHERE NOT EXISTS (
    SELECT * FROM users
    WHERE books.user_id = users.id
)

Ответ 8

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

Ответ 9

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

ПОКАЗАТЬ СОСТОЯНИЕ INNODB ДВИГАТЕЛЯ

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

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

Ответ 10

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