0

我在 mysql 上得到另一个 errno 150。我已经查看了表引擎,列类型,但没有运气,在我看来它没有错。

这次我哪里出错了?

创建与 image_tag 和 tag_lang 相关的标签表时出现错误。

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

3 回答 3

4

这:

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

无效,因为image_tag没有任何以 . 开头的索引tag。如文档中所述

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

(在这种情况下,“引用的表”是image_tag,而“引用的列”只是tag。)

于 2012-03-04T03:20:03.040 回答
1

mysql 错误 150 的第一个谷歌结果显示:

如果您重新创建已删除的表,则它必须具有符合引用它的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果这些不满足,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

于 2012-03-04T03:16:23.697 回答
0

就我而言,这是一个问题

外键 (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*

它奏效了

于 2013-03-25T07:42:34.160 回答