错误150尝试更改表

时间:2010-11-17 13:01:18

标签: mysql sql mysql-error-1005

我有这个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`);

但是我得到了这个错误:

  

Errore查询SQL:

     

ALTER TABLE sedi_i18n ADD   约束sedi_i18n_FK_1外国人   KEY(id)参考sedi(   id)ON DELETE CASCADE,ADD   约束sedi_i18n_FK_2外国人   KEY(culture)参考   culturecode),添加约束   sedi_i18n_FK_3外键(   nation)参考nations(   iso_code_2);

     

Messaggio di MySQL:

     

1005 - 无法创建表'test_javier_4。#sql-528_aed'(错误号:150)

有什么想法吗?

此致

哈维

2 个答案:

答案 0 :(得分: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`);

答案 1 :(得分:0)

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