Не может добавить внешний ключ в 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) заключается в том, что вы не сделали столбец, на который ссылаетесь на первичный ключ.