这个表中的外键约束有什么问题?

时间:2011-10-05 21:14:56

标签: mysql sql foreign-keys

MySQL 5.1.59使用此create table抛出错误:

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生成。错误消息是:

  

ERROR 1005(HY000)第__行:无法创建表'mydb.genre'(错误号:150)

这个创建表出了什么问题?

The manual says

  

如果MySQL从CREATE TABLE语句报告错误号1005,   并且错误消息引用错误150,表创建失败   因为没有正确形成外键约束。

它还说允许对同一个表的外键引用:

  

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

我想要的关系是一个非识别的父子,代表一个流派和子流派的层次结构。类型不必具有父类,因此parent_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';

4 个答案:

答案 0 :(得分:9)

您的专栏idint unsigned;您的专栏parent_idint。那些不匹配。解决方案是将parent_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.

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

答案 1 :(得分:6)

这两个字段的类型不同。

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!!!!
  ....

答案 2 :(得分:5)

id 未签名,但parent_id未签名。

答案 3 :(得分:5)

字段必须是相同的类型。 id是无符号的,而parent_id不是