无法在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; 
+0

哪个MySQL版本? – Phil 2012-03-04 03:17:25

+0

mysql版本:5.1.41 – 2012-03-04 03:21:03

此:

REFERENCES `ratna`.`image_tag` (`tag`) 

是无效的,因为image_tag不具有与tag开头的指数。正如解释的in the documentation

InnoDB允许一个外键引用任何索引列或一组列。但是,在参考表格中,必须有一个索引,其中参考列以相同顺序列为第一个列。

(在这种情况下,“参考表”是image_tag,“参考列”只是tag。)

+0

即时消失了,是不是意味着我需要在表'image_tag'的'tag'上添加索引? – 2012-03-04 03:26:09

+0

这意味着你正试图定义一个引用'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

+0

我明白了。 在参考表中找不到索引,其中 引用列显示为第一列,或表中的列类型 与引用的表不匹配约束。 请注意,在使用> = InnoDB-4.1.12创建的表中,ENUM和SET的内部存储类型已更改,旧表 中的这些列不能被新表中的这些列引用。 – 2012-03-04 03:18:11

+0

是这意思,我不能引用主键到其他表? – 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 *

和它的工作