fir*_*fly 13 mysql foreign-keys mysql-error-1005
我使用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) ;
Run Code Online (Sandbox Code Playgroud)
当我点击申请时,惊喜就出来了!
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
Run Code Online (Sandbox Code Playgroud)
我在逻辑上找不到任何错误,甚至无法理解错误,请给我一个帮助.
小智 16
整个数据库中的所有外键名称必须是唯一的.如果您已经有一个名为"goodsId"的外键,即使在另一个表上,您也会收到此错误.
如果相关列没有完全相同的类型(例如INT)和约束(UNIQUE等),您将收到该错误.
小智 10
它可能因为许多原因而发生.以下是一些常见原因.您还可以说语法错误,因为这些错误会被抛出.
如果FK(外键)表引擎正在使用MyISAM和PK(主键)表,则引擎正在使用InnoDB.MyISAM不支持外键约束.因此,您可能希望将链接表转换为InnoDB.
整个数据库中的所有外键名称必须是唯一的.如果您已经具有相同名称的外键约束,即使在另一个表上,也会收到此错误.
如果相关列没有完全相同的数据类型(例如INT)和约束(UNIQUE等),您将收到该错误.
当使用MyISAM存储链接到(在您的情况下为Goods)的表时,我收到此错误,并且使用InnoDB存储要添加索引的表(在您的情况下,声明).
您可以从数据库目录中的文件中进行说明.MyISAM表将包含以下文件:
table_name.frm
table_name.MYD
table_name.MYI
Run Code Online (Sandbox Code Playgroud)
InnoDB表只有:
table_name.frm
Run Code Online (Sandbox Code Playgroud)
MyISAM不支持外键约束.我建议将您的Goods表转换为InnoDB(但是,先查看文档并进行一些基础研究):
ALTER TABLE Goods ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)
进行此更改后,我的ADD INDEX操作成功完成.
Goods.goodsId和的类型定义Declarations.goodsId必须相同,否则您将得到errno: 150.
确保它们的数据类型相同,这goodsId INT(11) NOT NULL在Declarations表中看起来是这样的。声明是CREATE TABLE为了什么Goods?