Php 无法在Mysql上创建表errno:150
我在mysql上得到了另一个Errno150。我已经看了表引擎,列类型,但没有运气,在我看来它没有错 这次我错在哪里 创建与image_tag和tag_lang相关的标记表时出错Php 无法在Mysql上创建表errno:150,php,mysql,mysql-error-1005,Php,Mysql,Mysql Error 1005,我在mysql上得到了另一个Errno150。我已经看了表引擎,列类型,但没有运气,在我看来它没有错 这次我错在哪里 创建与image_tag和tag_lang相关的标记表时出错 -- ----------------------------------------------------- -- Table `ratna`.`image_tag` -- ----------------------------------------------------- DROP TABLE IF EXI
-- -----------------------------------------------------
-- 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;
mysql错误150的第一个google结果显示: 如果重新创建已删除的表,则该表的定义必须符合引用该表的外键约束。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果不满足这些条件,MySQL将返回错误号1005,并在错误消息中引用错误150 如果MySQL报告CREATETABLE语句中的错误号1005,并且错误消息指向错误150,则表创建失败,因为外键约束的格式不正确。类似地,如果ALTER表失败并且它引用了错误150,这意味着将为被修改的表错误地形成外键定义。您可以使用ShowEngine INNODB STATUS来显示服务器中最近的INNODB外键错误的详细说明
mysql错误150的第一个google结果显示: 如果重新创建已删除的表,则该表的定义必须符合引用该表的外键约束。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果不满足这些条件,MySQL将返回错误号1005,并在错误消息中引用错误150 如果MySQL报告CREATETABLE语句中的错误号1005,并且错误消息指向错误150,则表创建失败,因为外键约束的格式不正确。类似地,如果ALTER表失败并且它引用了错误150,这意味着将为被修改的表错误地形成外键定义。您可以使用ShowEngine INNODB STATUS来显示服务器中最近的INNODB外键错误的详细说明 这是:
REFERENCES `ratna`.`image_tag` (`tag` )
无效,因为image\u标记
没有任何以标记
开头的索引。如前所述:
InnoDB
允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列按相同顺序列为第一列
(“本例中引用的表”是image\u tag
,而“引用的列”只是tag
)这:
REFERENCES `ratna`.`image_tag` (`tag` )
无效,因为image\u标记
没有任何以标记
开头的索引。如前所述:
InnoDB
允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列按相同顺序列为第一列
(“本例中引用的表”是
image\u tag
,“引用的列”只是tag
)在我的案例中,它是
外键(表\u列\u名称\u小写)引用
主关键字表大写(表列小写)
因为我的主键表是小写的,所以我将这个大写外键引用从
*大写的主键表*
到
*小写字母中的主键表*
在我的情况下,它起了作用,这是一个问题 外键(表\u列\u名称\u小写)引用 主关键字表大写(表列小写) 因为我的主键表是小写的,所以我将这个大写外键引用从 *大写的主键表* 到 *小写字母中的主键表*
它成功了我明白了。在引用表中找不到引用列作为第一列出现的索引,或者该表中的列类型与引用表中的列类型不匹配。请注意,ENUM和SET的内部存储类型在使用>=InnoDB-4.1.12创建的表中已更改,并且旧表中的这些列不能被新表中的这些列引用。这是否意味着,我不能将主键引用到其他表?我明白了。在引用表中找不到引用列作为第一列出现的索引,或者该表中的列类型与引用表中的列类型不匹配。请注意,ENUM和SET的内部存储类型在使用>=InnoDB-4.1.12创建的表中已更改,并且旧表中的这些列无法被新表中的这些列引用。这是否意味着我无法将主键引用到其他表?im丢失,这是否意味着我需要在表
image\u-tag
中的tag
上添加索引?这意味着您试图定义一个引用image\u-tag(tag)
的外键,而在image\u-tag(tag)
上没有索引。因此,您需要放弃使用外键,或者需要以某种方式更改其定义,或者需要在image\u标记(tag)
或image\u标记(tag)
上添加索引。如果不了解更多关于您的应用程序的信息,我就无法告诉您哪一个是正确的选择。我迷路了,这是否意味着我需要在表image\u-tag
中的tag
上添加索引?这意味着您试图定义一个引用image\u-tag(tag)
的外键,而在image\u-tag(tag)
上没有索引。因此,您需要放弃使用外键,或者需要以某种方式更改其定义,或者需要在image\u标记(tag)
或image\u标记(tag)
上添加索引。如果不了解你的申请,我无法告诉你哪一个是正确的选择。