mysql - 尝试更改表时出现错误 150

标签 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 query SQL:

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 ) ;

Messaggio di MySQL:

1005 - Can't create table 'test_javier_4.#sql-528_aed' (errno: 150)

有什么想法吗?

问候

哈维

最佳答案

问题是 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`);

关于mysql - 尝试更改表时出现错误 150,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204572/

相关文章:

php - 从表中选择唯一值

mysql - SQL 关联实体的语法错误

MYSQL,在定义表时,UNIQUE 约束是否必须与 INTEGER 结合使用,还是可以是任何数据类型?

MySQL FK 到非唯一字段不起作用

php - 如何在 MySQL 中选择 3 个相邻的行并重点关注较低的值?

MySQL 错误 : #1005 - Can't create table (errno: 150) When I try create more than 1 FK

php - 每个用户都应该有一个单独的孤立数据库吗?

mysql - 使用 mysql 我需要检索每个类别中最后插入的内容

MySQL UNION 在同一个表上有两个 WHERE 子句

mysql - 我如何完全加入Mysql?