Mysql 什么';表中的外键约束有什么问题?
MySQL 5.1.59对此创建表抛出错误: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
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有很好的联系,所以他的接受是值得的。