mysql。无法创建表 errno 150
Posted
技术标签:
【中文标题】mysql。无法创建表 errno 150【英文标题】:MySQL. Can't create table errno 150 【发布时间】:2010-12-17 11:40:01 【问题描述】:我必须在 mysql 中创建一个包含两个表的数据库,但脚本失败并显示 errno 150(外键问题)。我仔细检查了两个表上的外键字段是否相同,我找不到任何错误。
这是脚本:
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';
DROP SCHEMA IF EXISTS `testdb`;
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
USE `testdb`;
DROP TABLE IF EXISTS `testdb`.`table1` ;
CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
`id` INT UNSIGNED NOT NULL ,
`field1` VARCHAR(50) NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
DROP TABLE IF EXISTS `testdb`.`table2` ;
CREATE TABLE IF NOT EXISTS `testdb`.`table2` (
`id` INT NOT NULL AUTO_INCREMENT ,
`field1` VARCHAR(50) NULL ,
`date` DATE NULL ,
`cnt` INT NULL ,
PRIMARY KEY (`id`) ,
INDEX `FK_table2_table1` (`field1` ASC) ,
CONSTRAINT `FK_table2_table1`
FOREIGN KEY (`field1`)
REFERENCES `testdb`.`table1` (`field1` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
我在 Windows 和 Ubuntu 中使用不同版本的 MySQL 进行了尝试,但没有成功。
有什么想法吗?
【问题讨论】:
我在尝试创建一个对另一个尚不存在的表具有 FK 约束的表时也收到此错误。这是一个很容易解决的问题,但由于一条完全无用的错误消息而变得非常困难。 对于从 google 获取的用户,如果您在外键的表名上输入错误,也会发生此错误。 【参考方案1】:一个选项(视情况而定)是禁用 MySQL 完整性检查:
SET FOREIGN_KEY_CHECKS = 0;
【讨论】:
【参考方案2】:始终先创建主/父表,然后再创建详细/子表。
【讨论】:
【参考方案3】:当我遇到这个问题时,是因为我将第一个表中的 id 设置为 unsigned
而第二个表中的外键不是。让他们都 unsigned
为我修好了。
【讨论】:
【参考方案4】:我在尝试使用外键引用非唯一字段时遇到此错误。 (不允许使用apparently)
【讨论】:
【参考方案5】:如果您正在使用 mysql 工作台,并且您在关系表中遇到此错误,那么您可能有一个快速修复方法:只需删除它并让 mysql 工作台为您重新创建它。然后复制sql。修复了我的 errno 150 问题。
【讨论】:
【参考方案6】:在非常奇怪的情况下,您的数据库可能会损坏。在我的情况下,我的表上没有任何外键,唯一的重命名表或更改引擎有帮助。
原来innoDB坏了,见:https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to-a?lq=1
【讨论】:
【参考方案7】:在我的情况下,可能是服务器错误删除了同名表。 删除整个 shcema 并重新创建它可以解决问题。
【讨论】:
【参考方案8】:在尝试引用外键中的复合键时,您也可能会遇到同样的错误。
例如:
CREATE TABLE `article` (
`id` int(10) unsigned NOT NULL,
`type` enum('X','Y','Z') NOT NULL,
PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;
CREATE TABLE `t1` (
`user_id` int(10) unsigned NOT NULL,
`type` enum('X','Y','Z') NOT NULL,
`article_id` int(10) unsigned NOT NULL,
CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
在这种情况下,请务必按照它们在文章表 PRIMARY KEY 定义中出现的顺序在 FK 定义中使用 article_id 和 type 字段。
【讨论】:
【参考方案9】:table1.field1
上没有定义索引。
需要在field1
上放置FOREIGN KEY
约束。
有了这个:
CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
`id` INT UNSIGNED NOT NULL ,
`field1` VARCHAR(50) NULL ,
KEY ix_table1_field1 (field1),
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
然后一切都应该按预期工作。
【讨论】:
虽然它在这种情况下不适用,但如果您尝试添加外键约束并在删除时为不可为空的列设置为 null,您将收到相同的错误消息。【参考方案10】:对我来说,问题在于在 CREATE TABLE
查询中使用 CONSTRAINT
。
【讨论】:
【参考方案11】:如果您输入错误的引用表的名称,MySQL 也会抛出此错误。我拉了一会儿头发,直到我意识到我错过了foreign key (column1) references mistyped_table(column1)
中的一封信
【讨论】:
在某些情况下,(表名的)大小写很重要 - 在某些情况下则不重要。例如,我的脚本在 OSX 上的 mysql 上工作,但在 linux 上我有这个 errno: 150 问题。案例是我的问题。 同样,我有FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
,但user
表没有id
字段——它被称为user_id
!所以在上面我把user(id)
改成了user(user_id)
,现在一切都很好了……现在。【参考方案12】:
在我的情况下,我在其中一个表中获得了旧表定义 MyISAM,显然我无法从另一个表中为其创建外键。也许这对某人有帮助。
所以这可能是因为尝试检查的两个数据库/字段定义之间的不一致:
Field Type
Field Collation
Table Engine
【讨论】:
【参考方案13】:还有另一个原因,尽管与其他原因有些相似:我指的是一个表,它原来具有 MyISAM 引擎,而不是 InnoDB。
【讨论】:
【参考方案14】:我的一张桌子上出现了类似的错误。检查时,列排序规则不同,一旦将两列更改为相同的排序规则类型即可。
在阅读了此处建议的大部分解决方案后。我只是认为如果我列出所有可能引发此错误的可能性可能会有所帮助。
1、检查列的CASE 2、检查列的COLLATION 3、检查是否在两个表中都为该列创建了一个键(Unique, Primary)
【讨论】:
【参考方案15】:此处的答案之一建议禁用外键完整性检查。这是一个坏主意。这里有两个可能的罪魁祸首:
引用的主键和引用的外键之间的数据类型不匹配 指数。您索引的任何外键都必须为 NOT NULL【讨论】:
NOT NULL 参数不适用于我的 Mysql 5.5【参考方案16】:另一个提示:
即使您的数据类型似乎相同 - 在我的情况下,两列都有 VARCHAR(50)
- 这还不够。
您还需要确保两列具有相同的COLLATION
。
【讨论】:
【参考方案17】:在使用 MySQL Workbench 和 MySQL 5.5.27 时,我遇到了类似的问题。在我的情况下,问题与 INT 类型字段有关。错误地在一个表中它是 INT UNSIGNED,而在引用表中它是 INT。
【讨论】:
这正是我的问题。谢谢!【参考方案18】:我使用的是MySQL workBench
。问题是您不能使用相同的foreign key name
,它们必须是unique
。因此,如果多个表将引用同一个外键,则每次都必须给出一个 unique
名称。
【讨论】:
【参考方案19】:如果有人仍然对此有问题,我尝试了上述所有解决方案(SET FOREIGN_KEY_CHECKS 除外),但没有任何效果。问题是当您引用第一个表时,某些数据库对表名区分大小写。我认为这很奇怪,因为我以前从未在 MySQL、Oracle 上看到过这种情况,而现在这发生在 MariaDB 上。
例如:
如果不存在则创建表 CADASTRO_MAQUINAS ( ID VARCHAR(16), 主键(ID) );
如果不存在则创建表 INFOS ( Id_Maquina VARCHAR(16) 非空, 约束 FK_infos_cadastro_maquinas 外键 (Id_Maquina) 引用 CADASTRO_MAQUINAS(Id) );
如果我尝试使用 cadastro_maquinas(小写)而不是 CADASTRO_MAQUINAS 创建第二个表,我将收到此错误。
【讨论】:
【参考方案20】:在我的例子中,一个表在另一张表上使用了外键约束,但该表还不存在。这是由于生成文件很大,所以它不像我预期的那么明显。
【讨论】:
【参考方案21】:如果没有任何效果,试试这个:
外键名称是现有键的副本。检查您的外键名称在您的数据库中是唯一的。只需在密钥名称的末尾添加几个随机字符即可进行测试。
【讨论】:
【参考方案22】:根据 MySQL 的版本,您可能需要先在 table1.field1 上创建索引。
【讨论】:
以上是关于mysql。无法创建表 errno 150的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK
MySQL 错误:#1005 - 无法创建表 (errno: 150) 当我尝试创建超过 1 个 FK
MySQL“错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)”