创建表时出现的MySql错误

5
我想在MySQL中创建一个表,其中主键引用了其他表的两列,类似于以下内容:
CREATE  TABLE IF NOT EXISTS `tarina`.`Geo_Distrito` (
  `departamento` INT(10) NOT NULL ,
  `provincia` INT(10) NOT NULL ,
  `codigo` INT(10) NOT NULL ,
  `nombre` VARCHAR(80) NULL ,
  `estado` INT(10) NULL ,
  PRIMARY KEY (`departamento`, `provincia`, `codigo`) ,
  CONSTRAINT `FK_ProvinciaDistrito`  FOREIGN KEY (`departamento` , `provincia` )  REFERENCES `Geo_Provincia` (`departamento` , `codigo` )
)ENGINE = InnoDB;

我遇到了以下错误:

Can't create table 'tarina.Geo_Distrito' (errno: 150)

有人能告诉我问题出在哪里吗?

数据库 tarina 已创建? - Book Of Zeus
是的,我已经创建了许多具有相同用户的表。 - jcvegan
表格 Geo_Provincia 存在吗?它有列吗?这个表格没有损坏吗? - Book Of Zeus
Geo_Provincia存在,它有两个主键列,这可能会有问题吗? - jcvegan
你能展示一下这个的创建语句吗? - Book Of Zeus
让我们在聊天中继续这个讨论 - Book Of Zeus
1个回答

10

无法创建表。如果错误信息引用错误150,则由于外键约束未正确形成,表创建失败。如果错误信息引用错误-1,则表的创建可能失败,因为该表包括与内部InnoDB表的名称相匹配的列名。

这是因为列的定义必须相同。在您的情况下:

列类型不同,codigo int(10) unsigned NOT NULL 和 codigo INT(10) NOT NULL ,

另外,您使用的FK provincia 也与 codigo 的类型不同。

以下是脚本:

DROP TABLE IF EXISTS `Geo_Distrito`;
DROP TABLE IF EXISTS `Geo_Provincia`;
DROP TABLE IF EXISTS `Geo_Departamento`;

CREATE TABLE `Geo_Departamento` (
`codigo` int(10) unsigned NOT NULL COMMENT 'Codigo autogenerado',
`nombre` varchar(80) NOT NULL COMMENT 'Nombre del departamento',
`estado` int(10) unsigned NOT NULL COMMENT 'Estado de departamento',
PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Tabla de Departamentos';


CREATE TABLE `Geo_Provincia` (
`codigo` int(10) unsigned NOT NULL COMMENT 'Codigo autogenerado',
`departamento` int(10) unsigned NOT NULL,
`nombre` varchar(45) NOT NULL,
`estado` int(10) unsigned NOT NULL,
PRIMARY KEY (`departamento`,`codigo`) USING BTREE,
CONSTRAINT `FK_ProvinciaDepartamento` FOREIGN KEY (`departamento`) REFERENCES `Geo_Departamento` (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Tabla de provincias del sistema.';

CREATE  TABLE IF NOT EXISTS `Geo_Distrito` (
`departamento` int(10) unsigned NOT NULL,
`provincia` int(10) unsigned NOT NULL,
`codigo` int(10) unsigned NOT NULL COMMENT 'Codigo autogenerado',
`nombre` VARCHAR(80) NULL ,
`estado` INT(10) NULL ,
PRIMARY KEY (`departamento`, `provincia`, `codigo`) ,
CONSTRAINT `FK_ProvinciaDistrito`  FOREIGN KEY (`departamento` , `provincia` )  REFERENCES `Geo_Provincia` (`departamento` , `codigo` )
)ENGINE = InnoDB;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接