MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK
Posted
技术标签:
【中文标题】MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK【英文标题】:MySQL Error : #1005 - Can't create table (errno: 150) When I try create more than 1 FK 【发布时间】:2012-04-13 19:33:27 【问题描述】:我有这张桌子:
CREATE TABLE IF NOT EXISTS `produtos` (
`id` int(11) NOT NULL auto_increment,
`idcatprodutos` int(11) NOT NULL,
`idcategoria` int(11) NOT NULL,
`idmarca` int(11) NOT NULL,
`nome` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_produtos_2` (`idcatprodutos`),
KEY `FK_produtos_3` (`idmarca`),
KEY `FK_produtos_4` (`idcategoria`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=39 ;
还有这张桌子:
CREATE TABLE IF NOT EXISTS `sugestoes` (
`id` int(11) NOT NULL auto_increment,
`idproduto` int(11) NOT NULL,
`idsugestao1` int(11) NOT NULL,
`idsugestao2` int(11) NOT NULL,
`idsugestao3` int(11) NOT NULL,
`idsugestao4` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_sugestoes_prod` (`idproduto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED AUTO_INCREMENT=9 ;
我已经创建了一个 fk sugestoes.idproduto -> produtos.id
工作,但我希望其他每个字段也通过新的 FK 引用 produtos.id
。
在下面运行此命令,返回 mysql 错误:#1005 - Can't create table (errno: 150):
ALTER TABLE `infantile`.`sugestoes` ADD CONSTRAINT `FK_sugestoes_2` FOREIGN KEY `FK_sugestoes_2` (`idsugestao1`)
REFERENCES `produtos` (`id`)
ON DELETE SET NULL
ON UPDATE CASCADE
, ROW_FORMAT = FIXED;
有人知道发生了什么吗?
【问题讨论】:
为什么要在ALTER TABLE
中添加, ROW_FORMAT = FIXED
?
【参考方案1】:
也许删除ROW_FORMAT = FIXED
:
ALTER TABLE `infantile`.`sugestoes`
ADD CONSTRAINT `FK_sugestoes_2`
FOREIGN KEY `FK_sugestoes_2` (`idsugestao1`)
REFERENCES `produtos` (`id`)
ON DELETE SET NULL
ON UPDATE CASCADE
;
再想一想,当您的列使用NOT NULL
定义时,您希望ON DELETE SET NULL
的行为如何?
第三,表中是否有任何数据?如果某些行违反了此 FK 约束,则无法创建该 FK。
【讨论】:
【参考方案2】:试试这个,
有效:
ALTER TABLE `sugestoes`
ADD CONSTRAINT `FK_idproduto_produtos_1` FOREIGN KEY (`idproduto`) REFERENCES `produtos` (`id`),
ADD CONSTRAINT `FK_sugestoes_produtos_2` FOREIGN KEY (`idsugestao1`) REFERENCES `produtos` (`id`),
ADD CONSTRAINT `FK_sugestoes_produtos_3` FOREIGN KEY (`idsugestao2`) REFERENCES `produtos` (`id`),
ADD CONSTRAINT `FK_sugestoes_produtos_4` FOREIGN KEY (`idsugestao3`) REFERENCES `produtos` (`id`),
ADD CONSTRAINT `FK_sugestoes_produtos_5` FOREIGN KEY (`idsugestao4`) REFERENCES `produtos` (`id`)
更新:
你不能指定
ON DELETE SET NULL
因为这个:
您已经定义了一个 SET NULL 条件,尽管有些 列被定义为 NOT NULL
你可以在运行时看到确切的错误
SHOW ENGINE INNODB STATUS;
【讨论】:
更长的工作不能解决我的问题,我需要 ON DELETE SET NULL 和 SET OnUpdate Cascade,当我尝试进行这些更改时,会给出相同的错误消息。 我需要当用户DELETE一些produto.idproduto时对应的sugestao.idsugestao为null或空,如何设置?以上是关于MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK的主要内容,如果未能解决你的问题,请参考以下文章
使用 mysql 工作台创建 CHAR 类型的外键时出错:错误 1005:无法创建表(错误号:150)
MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK
MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK