代码之家  ›  专栏  ›  技术社区  ›  David Espart

Mysql。无法创建表errno 150

  •  68
  • David Espart  · 技术社区  · 15 年前

    我必须在MySQL中创建一个包含两个表的数据库,但脚本失败,错误号为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;
    

    我用不同版本的MySQL在Windows和Ubuntu上试用过,但都没用。

    有什么想法吗?

    22 回复  |  直到 5 年前
        1
  •  54
  •   Ian Lewis    10 年前

    table1.field1 没有定义索引。

    FOREIGN KEY field1

     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;
    

    然后一切都应该按预期进行。

        2
  •  49
  •   Mushtaq Hussain    12 年前

    在使用MySQL Workbench和MySQL 5.5.27时,我遇到了类似的问题。在我的例子中,问题是INT类型字段。在一个表中错误地使用INT无符号,在引用表中错误地使用INT。

        3
  •  13
  •   atomice    15 年前

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

        4
  •  8
  •   jwilm    11 年前

    这里的一个答案建议禁用外键完整性检查。这是个坏主意。这里有两个可能的罪犯:

    • 指数索引的任何外键都不能为空
        5
  •  6
  •   Alex    12 年前

    另一个提示:

    即使您的数据类型看起来是相同的——在我的例子中,两列都是相同的 VARCHAR(50)

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

        6
  •  5
  •   Sherlock    11 年前

    还有另一个原因,尽管与其他原因稍有相似:我指的是一个表,它原来是MyISAM引擎,而不是InnoDB。

        7
  •  5
  •   Cfreak    11 年前

    如果您错误输入引用表的名称,MySQL也会抛出此错误。我把头发拔了一段时间,直到我意识到我错过了一封信 foreign key (column1) references mistyped_table(column1)

        8
  •  5
  •   Peter Mortensen icecrime    5 年前

    一个选项(取决于具体情况)是禁用MySQL完整性检查:

    SET FOREIGN_KEY_CHECKS = 0;
    
        9
  •  1
  •   Arvind Bhardwaj    12 年前

    如果没有任何效果,请尝试以下方法:

    外键名称是现有键的副本。检查外键的名称在数据库中是否唯一。只需在密钥名称的末尾添加几个随机字符即可测试。

        10
  •  1
  •   Community CDub    8 年前

    我在尝试使用外键引用非唯一字段时出错。(哪个 apparently (不允许)

        11
  •  0
  •   Tyler Collier    12 年前

        12
  •  0
  •   Vini.g.fer    12 年前

    如果有人对此仍有问题,我尝试了上述所有解决方案(设置外键检查除外),但没有任何效果。问题是,当您引用第一个表时,某些数据库对表名区分大小写。我觉得这很奇怪,因为我以前从未在MySQL、Oracle上看到过这种情况,现在我在MariaDB上看到了这种情况。

    例如:

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

    如果信息不存在,则创建表( Id_Maquina VARCHAR(16)不为空, 约束FK_infos_cadastro_maquinas外键(Id_Maquina)引用cadastro_maquinas(Id) );

    如果我尝试使用cadastro_maquinas(小写)而不是cadastro_maquinas创建第二个表,我将收到此错误。

        13
  •  0
  •   Baby Groot Duleendra    12 年前

    MySQL workBench . 问题是你不能使用相同的 foreign key name unique . 因此,如果多个表将引用同一外键,则每次都必须有一个 姓名。

        14
  •  0
  •   bumblebee    11 年前

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

    1、检查立柱的大小写 3、检查是否在两个表中为列创建了键(唯一,主)

        15
  •  0
  •   Radamanf    11 年前

    在我的例子中,我在其中一个表中得到了旧的表定义MyISAM,显然我无法从另一个表中为它生成外键。也许这能帮助别人。

    因此,这可能是由于两个数据库/字段定义之间的不一致性导致的。请尝试检查:

    Field Type
    Field Collation
    Table Engine
    
        16
  •  0
  •   Patrick Moore    11 年前

    对我来说,问题在于使用 CONSTRAINT CREATE TABLE 查询

        17
  •  0
  •   crocodile2u    10 年前

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

    例如:

    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
    

        18
  •  0
  •   David Gras    10 年前

    在我的例子中,可能是服务器错误删除了一个同名的表。 放弃整个shcema并重新创建它解决了问题。

        20
  •  0
  •   clinical    9 年前

    如果您正在使用mysql workbench,并且在关系表中遇到此错误,那么可能有一个快速修复方法:删除它,让mysql workbench为您重新创建它。然后复制sql。修正了我的错误,没有问题。

        21
  •  0
  •   crmepham    7 年前

    当我遇到这个问题时,是因为我在第一个表中将id设置为 unsigned 而第二个表中的外键不是。让他们两个 未签名 帮我修好了。

        22
  •  0
  •   Peter Mortensen icecrime    5 年前