不能在mysql中添加外键?

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

它可能因为许多原因而发生.以下是一些常见原因.您还可以说语法错误,因为这些错误会被抛出.

  1. 如果FK(外键)表引擎正在使用MyISAM和PK(主键)表,则引擎正在使用InnoDB.MyISAM不支持外键约束.因此,您可能希望将链接表转换为InnoDB.

  2. 整个数据库中的所有外键名称必须是唯一的.如果您已经具有相同名称的外键约束,即使在另一个表上,也会收到此错误.

  3. 如果相关列没有完全相同的数据类型(例如INT)和约束(UNIQUE等),您将收到该错误.


Nee*_*eek 5

当使用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操作成功完成.


Mic*_*ski 0

Goods.goodsId和的类型定义Declarations.goodsId必须相同,否则您将得到errno: 150.

确保它们的数据类型相同,这goodsId INT(11) NOT NULLDeclarations表中看起来是这样的。声明是CREATE TABLE为了什么Goods