【问题标题】:Error 150 trying to alter a table尝试更改表时出现错误 150
【发布时间】:2010-11-17 13:01:18
【问题描述】:

我有这个 sql 子句:

CREATE TABLE IF NOT EXISTS `culture` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` char(6) NOT NULL DEFAULT 'it',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;


CREATE TABLE IF NOT EXISTS `nations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `culture_id` int(11) NOT NULL,
  `iso_code_2` char(2) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `nations_FI_1` (`culture_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=245 ;


CREATE TABLE IF NOT EXISTS `sedi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;


CREATE TABLE IF NOT EXISTS `sedi_i18n` (
  `id` int(11) NOT NULL,
  `culture` char(6) NOT NULL,
  `nation` char(2) NOT NULL,
  `indirizzo` text NOT NULL,
  PRIMARY KEY (`id`,`culture`),
  KEY `sedi_i18n_FI_2` (`culture`),
  KEY `sedi_i18n_FI_3` (`nation`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


ALTER TABLE `sedi_i18n`
  ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `sedi_i18n_FK_2` FOREIGN KEY (`culture`) REFERENCES `culture` (`code`),
  ADD CONSTRAINT `sedi_i18n_FK_3` FOREIGN KEY (`nation`) REFERENCES `nations` (`iso_code_2`);

但我遇到了这个错误:

查询 SQL 错误:

改变表sedi_i18n添加 约束sedi_i18n_FK_1外国 关键(id)参考sediid) 删除级联,添加 约束sedi_i18n_FK_2外国 关键(culture)参考 culture (code),添加约束 sedi_i18n_FK_3 外键 ( nation ) 参考资料 nations ( iso_code_2);

MySQL 消息:

1005 - 无法创建表 'test_javier_4.#sql-528_aed' (errno: 150)

有什么想法吗?

问候

贾维

【问题讨论】:

    标签: mysql sql mysql-error-1005


    【解决方案1】:

    问题是您的 3 个外键中有 2 个引用了父表中既不是主键也不是唯一索引的列。

    所有外键列必须引用父表中的主键或唯一键。

    这是两个错误的外键:

      ADD CONSTRAINT `sedi_i18n_FK_2` FOREIGN KEY (`culture`) REFERENCES `culture` (`code`),
      ADD CONSTRAINT `sedi_i18n_FK_3` FOREIGN KEY (`nation`) REFERENCES `nations` (`iso_code_2`);
    

    如果这些列在父表中是唯一的,那么您可以通过在它们上添加唯一索引来解决此问题,如下所示:

    alter table `culture`
      add unique key (`code`);
    
    alter table `nations`
      add unique key (`iso_code_2`);
    

    【讨论】:

      【解决方案2】:

      来自MySQL documentation

      1005 (ER_CANT_CREATE_TABLE)

      无法创建表。如果错误消息指的是错误 150,则表创建失败,因为没有正确形成外键约束。

      您能否通过一次运行一个外键约束添加来隔离三个外键约束添加中的哪一个导致错误?喜欢:

      ALTER TABLE `sedi_i18n`
        ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE
      

      【讨论】:

        猜你喜欢
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多