代码之家  ›  专栏  ›  技术社区  ›  tirenweb

试图更改表时出现错误150

  •  0
  • tirenweb  · 技术社区  · 14 年前

    我有以下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 )参考文献 sedi ( 身份证件 )删除层叠时,添加 约束 sedi_i18n_FK_2 外国 密钥(密钥) culture )参考文献 文化 ( code )添加约束 sedi_i18n_FK_3 外键( nation )参考文献 nations ( iso_code_2 );

    梅萨吉奥·迪·迈sql:

    1005-无法创建表“test_javier_4.sql-528_aed”(错误号:150)

    知道吗?

    当做

    贾维

    2 回复  |  直到 14 年前
        1
  •  1
  •   Ike Walker    14 年前

    问题是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
  •  0
  •   littlegreen    14 年前

    来自 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