我想创建一个表,其中主键引用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;
Run Code Online (Sandbox Code Playgroud)
并得到这个错误:
Can't create table 'tarina.Geo_Distrito' (errno: 150)
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这是什么问题?
Boo*_*eus 10
无法创建表.如果错误消息引用错误150,则表创建失败,因为未正确形成外键约束.如果错误消息引用错误-1,则表创建可能失败,因为该表包含与内部InnoDB表的名称匹配的列名.
这是因为您的列的定义必须相同.在你的情况下:
列不是同一类型, codigo int(10) unsigned NOT NULL and 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;
Run Code Online (Sandbox Code Playgroud)