2009-11-17 138 views
68

我必须在mysql中创建一个带有2个表的数据库,但脚本失败,并显示errno 150(外键问题)。我仔细检查了两个表上的外键字段是相同的,我找不到任何错误。Mysql。无法创建表errno 150

下面是脚本:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

我已经与不同版本的MySQL试图在Windows和Ubuntu和没有工作。

任何想法?非常感谢。

+9

我还试图通过创建一个FK约束表到另一个不存在的表来接收这个错误。这是一个容易解决的问题,由于完全无用的错误信息而变得非常困难。 – Cerin 2012-03-12 16:08:48

+2

对于那些从谷歌来的人来说,如果你在外键的表名上输入错误,也会发生这个错误。 – 2013-11-26 17:39:11

回答

54

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; 

一切都应该按预期工作。

+5

根据手册,它不需要是唯一的。 – 2009-11-17 14:47:53

+0

'@Vilx:'正确,15个字符。 – Quassnoi 2009-11-17 14:49:50

+17

尽管它不适用于这种情况,但如果您尝试添加外键约束,并且在删除设置为非可空列的空值时,您将得到相同的错误消息。 – 2012-11-09 02:32:41

13

根据MySQL的版本,您可能需要首先在table1.field1上创建一个索引。

1

如果实在不行,试试这个:

外键的名称是一个已经存在的密钥的副本。检查您的外键的名称在您的数据库中是唯一的。只需在您的密钥名称末尾添加几个随机字符即可对此进行测试。

0

总是先创建主表/父表,然后创建您的详细信息/子表。

5

一个选项(视情况而定),将禁止MySQL的完整性检查:

SET FOREIGN_KEY_CHECKS = 0; 
0

对我来说,一个表是使用上还不存在其它表的外键约束。这是由于一个大的makefile造成的,所以没有我期望的那么明显。

0

如果有人仍然有这个问题,我尝试了上述所有解决方案(SET FOREIGN_KEY_CHECKS除外),并没有任何工作。问题在于,当您引用第一个表时,某些数据库对表名称区分大小写。我觉得这很奇怪,因为我从来没有在MySQL和Oracle上看到过这种情况,现在MariaDB上发生了这种情况。

例如:

创建表,如果不存在CADASTRO_MAQUINAS( 标识VARCHAR(16), 主键(Id)的 );

创建表,如果不存在INFOS( Id_Maquina VARCHAR(16)NOT NULL, 约束FK_infos_cadastro_maquinas外键(Id_Maquina)引用CADASTRO_MAQUINAS(Id)的 );

如果我尝试使用cadastro_maquinas(小写)代替CADASTRO_MAQUINAS创建第二个表格,我将收到此错误。

0

我正在使用MySQL workBench。这个问题是你不能使用相同的foreign key name,他们需要是unique。所以如果多于一个表将引用相同的外键,则每次必须给出一个unique名称。

50

在使用MySQL Workbench和MySQL 5.5.27时,我遇到了类似的问题。在我的情况下,问题是与INT类型字段。错误地在一张表中是INT UNSIGNED,在参考表中是INT。

+11

这正是我的问题。谢谢! – 2013-07-04 15:40:14

6

另一个提示:

即使你的数据类型似乎是相同的 - 在我的情况都列有VARCHAR(50) - 这是不够的。

您还需要确保两列具有相同的COLLATION

8

其中一个答案建议禁用外键完整性检查。这是一个坏主意。这里有两种可能的罪魁祸首:引用的主键和引用外键

  • 指数之间

    • 数据类型不匹配。你索引的任何外键必须是非空
  • +1

    对我来说这是一个数据类型不匹配......感谢您的帮助! – sbditto85 2013-07-02 20:43:07

    +0

    NOT NULL参数不适用于我的Mysql 5.5 – 2016-05-16 16:30:23

    0

    我在我的一个表上有类似的错误。当检查列Collat​​ion不同时,它曾将两个列都更改为相同的Collat​​ion类型。

    在阅读了大部分建议的解决方案后。我只是想,如果我列出所有可能引发此错误的可能性,这可能会有所帮助。

    1,检查CASE列 2,检查列 3核对,检查是否存在是列在两个表中创建的密钥(唯一的,首要的)

    5

    又一原因,虽然略有相似给其他人:我指的是一张表,后来证明有MyISAM引擎,而不是InnoDB。

    0

    在我的情况下,我在其中一个表中得到了旧表定义MyISAM,显然我无法从另一个表中创建外键。也许这有助于某人。

    所以这可能是因为两个数据库之间的不一致的发生/字段的定义尝试检查:如果你的错误输入的参考表的名称

    Field Type 
    Field Collation 
    Table Engine 
    
    5

    MySQL也将抛出此错误。我把我的头发过一段时间,直到我意识到我错过了在foreign key (column1) references mistyped_table(column1)

    +0

    在某些情况下,表(表名)的情况很重要 - 有些情况不是。例如,我的脚本在OSX上的mysql上工作,但在Linux上我有这个errno:150问题。案件是我的问题。 – prule 2014-11-06 01:16:04

    +0

    同样,我有'FOREIGN KEY(user_id)REFERENCES user(id)ON DELETE CASCADE',但'user'表没有'id'字段 - 它被称为'user_id'!所以在上面,我将'user(id)'改为'user(user_id)',并且所有的都在这个宇宙中再次出现......现在。 – elimisteve 2015-10-09 22:56:40

    0

    一封信给我,问题是用在CREATE TABLE查询中使用CONSTRAINT

    0

    尝试在外键中引用复合键时,您也可能会遇到相同的错误。

    例如:

    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 
    

    在这种情况下,它们出现在文章表的主键定义中使用的article_id和类型字段在FK定义非常相同的顺序是非常重要的。

    0

    在我的情况下,可能是一个服务器bug删除一个同名的表。 删除整个shcema并重新创建它解决了问题。

    0

    如果您正在使用MySQL工作台,你会得到这个错误的关系表有可能是你一个快速的解决办法:删除它,让MySQL工作台重新创建它适合你。然后复制sql。修复了我的errno 150问题。

    0

    我在尝试使用外键引用非唯一字段时出现此错误。 (其中apparently是不允许的)

    0

    当我遇到这个问题时,这是因为我已经将第一个表中的ID设置为unsigned而第二个表中的外键不是。让他们都unsigned为我修复它。

    相关问题