【发布时间】:2011-10-05 21:14:56
【问题描述】:
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' (errno: 150)
这个创建表有什么问题?
如果 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';
【问题讨论】:
-
SHOW ENGINE InnoDB STATUS收到该错误后立即。通常它会给你真正的错误信息。 -
+1 一个格式精美的问题,包含所有相关信息。
-
这是一个方便的提示,derobert,谢谢!
标签: mysql sql foreign-keys