Mysql 什么';表中的外键约束有什么问题?

Mysql 什么';表中的外键约束有什么问题?,mysql,sql,foreign-keys,Mysql,Sql,Foreign Keys,MySQL 5.1.59对此创建表抛出错误: CREATE TABLE IF NOT EXISTS `genre` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `abv` CHAR(3) CHARACTER SET 'latin1' COLLATE 'latin1_bin' NULL DEFAULT NULL , `name` VARCHAR(80) NOT NULL DEFAULT '' , `parent_id` INT NUL

MySQL 5.1.59对此创建表抛出错误:

CREATE  TABLE IF NOT EXISTS `genre` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `abv` CHAR(3) CHARACTER SET 'latin1' COLLATE 'latin1_bin' NULL DEFAULT NULL ,
  `name` VARCHAR(80) NOT NULL DEFAULT '' ,
  `parent_id` INT NULL DEFAULT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_genre_genre1` (`parent_id` ASC) ,
  CONSTRAINT `fk_genre_genre1`
    FOREIGN KEY (`parent_id` )
    REFERENCES `genre` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;
这是由MySQLWorkbench 5.2.33生成的。错误消息是:

第行出现错误1005(HY000):无法创建表“mydb.genre”(错误号:150)

这个创建表有什么问题

:

如果MySQL在CREATETABLE语句中报告错误号1005, 错误消息指的是错误150,表创建失败 因为外键约束的格式不正确

它还表示允许对同一个表进行外键引用:

InnoDB支持表内的外键引用。在这些情况下, “子表记录”实际上是指 同一张桌子

我想要的关系是一个不可识别的父子关系,以表示类型和子类型的层次结构。流派不必有父元素,因此父元素id可以为空

MySQLWorkbench设置以下内容可能是相关的:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

这两个字段的类型不同

CREATE  TABLE IF NOT EXISTS `genre` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,  <<-- unsigned int
  ..
  ..
  `parent_id` INT NULL DEFAULT NULL ,        <<-- signed int
  PRIMARY KEY (`id`) ,                   ***** not the same!!!!
  ....
创建表(如果不存在)`genre`(

`id`INT UNSIGNED NOT NULL AUTO_INCREMENT,
id
UNSIGNED但是
父id
不是UNSIGNED。

字段必须是相同的类型。id是UNSIGNED而父id不是您的列
id
INT UNSIGNED
;您的列
父id
INT
。这些都不是atch.解决方案是将
parent\u id
也更改为
int unsigned


如果您运行我在注释中输入的
SHOW ENGINE InnoDB STATUS
,您会看到:

11005 17:18:38 Error in foreign key constraint of table test/genre:

    FOREIGN KEY (`parent_id` )
    REFERENCES `genre` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

注意“表中的列类型与引用的表不匹配”部分。

在收到错误后立即显示引擎InnoDB状态。
通常会给您真正的错误消息。+1用于一个包含所有相关信息的格式良好的问题。这是一个方便的提示,derobert,谢谢!这是一个简单的修复方法!谢谢。太好了!谢谢!我给derobert打勾是因为他比我早了一分钟。@f某人,不,他不是!-)我16分钟前,德洛伯特15分钟前。尽管如此,derobert还是与ShowEngine thingy有很好的联系,所以他的接受是值得的。