【问题标题】:MySQL Error : #1005 - Can't create table (errno: 150) When I try create more than 1 FKMySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 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

标签: mysql foreign-keys mysql-error-1005


【解决方案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或空时,如何设置?
    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2016-10-12
    • 1970-01-01
    • 2011-02-17
    • 2012-10-07
    相关资源
    最近更新 更多