无法在Mysql上创建表errno:150
我在mysql上获得另一个errno 150。我已经看过表引擎,列类型,但没有运气,在我看来它没有错。无法在Mysql上创建表errno:150
这次我会出错吗?
我在创建与image_tag和tag_lang相关的标记表时出错。对于MySQL错误150显示
-- -----------------------------------------------------
-- Table `ratna`.`image_tag`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ratna`.`image_tag` ;
CREATE TABLE IF NOT EXISTS `ratna`.`image_tag` (
`id` INT(11) NOT NULL ,
`tag` INT(11) NOT NULL ,
PRIMARY KEY (`id`, `tag`) ,
INDEX `image_fk` (`id` ASC) ,
CONSTRAINT `image_fk`
FOREIGN KEY (`id`)
REFERENCES `ratna`.`image` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `ratna`.`tag_lang`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ratna`.`tag_lang` ;
CREATE TABLE IF NOT EXISTS `ratna`.`tag_lang` (
`id` INT(11) NOT NULL ,
`lang` INT(20) NOT NULL ,
`tag_desc` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
PRIMARY KEY (`id`, `lang`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
-- -----------------------------------------------------
-- Table `ratna`.`tag`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ratna`.`tag` ;
CREATE TABLE IF NOT EXISTS `ratna`.`tag` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
`seq` INT(11) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `image_tag_fk` (`id` ASC) ,
INDEX `tag_lang` (`id` ASC) ,
CONSTRAINT `image_tag_fk`
FOREIGN KEY (`id`)
REFERENCES `ratna`.`image_tag` (`tag`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `tag_lang`
FOREIGN KEY (`id`)
REFERENCES `ratna`.`tag_lang` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
AUTO_INCREMENT = 13
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
此:
REFERENCES `ratna`.`image_tag` (`tag`)
是无效的,因为image_tag
不具有与tag
开头的指数。正如解释的in the documentation:
InnoDB
允许一个外键引用任何索引列或一组列。但是,在参考表格中,必须有一个索引,其中参考列以相同顺序列为第一个列。
(在这种情况下,“参考表”是image_tag
,“参考列”只是tag
。)
即时消失了,是不是意味着我需要在表'image_tag'的'tag'上添加索引? – 2012-03-04 03:26:09
这意味着你正试图定义一个引用'image_tag(tag)'的外键,而不在'image_tag(tag)'上有索引。所以,*要么*您需要放弃拥有外键,*或*您需要以某种方式更改其定义,*或*您需要添加一个索引'image_tag(tag)'或'image_tag(标签,...)'。不知道更多关于您的应用程序的信息,我无法告诉您哪些是正确的选择。 – ruakh 2012-03-04 03:37:00
首款谷歌结果:
如果重新创建已删除的表,它必须有一个符合引用它的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上有索引。如果这些不满足,MySQL将返回错误号1005并引用错误消息中的错误150。
如果MySQL从CREATE TABLE语句报告错误号1005,并且错误消息引用了错误150,表创建失败,因为外键约束未正确形成。同样,如果一个ALTER TABLE失败并且引用了错误150,那就意味着一个外键的定义将不正确地为修改后的表格形成。您可以使用SHOW ENGINE INNODB STATUS来显示服务器中最新的InnoDB外键错误的详细说明。
http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
我明白了。 在参考表中找不到索引,其中 引用列显示为第一列,或表中的列类型 与引用的表不匹配约束。 请注意,在使用> = InnoDB-4.1.12创建的表中,ENUM和SET的内部存储类型已更改,旧表 中的这些列不能被新表中的这些列引用。 – 2012-03-04 03:18:11
是这意思,我不能引用主键到其他表? – 2012-03-04 03:19:31
是
外键(table_column_name_in_smaller_case)的问题引用 primary_key_table_in_upper_case(table_column_name_in_smaller_case)
,因为我的主键表是在较低的情况下,我改变了这种上国外
* primary_key_table_in _upper_case *
到
* primary_key_table_in_lower_case *
和它的工作
哪个MySQL版本? – Phil 2012-03-04 03:17:25
mysql版本:5.1.41 – 2012-03-04 03:21:03