代码之家  ›  专栏  ›  技术社区  ›  Martin Thurau

MySQL错误150-外键

  •  17
  • Martin Thurau  · 技术社区  · 17 年前

    当我执行以下两个查询时(我已经将它们简化为绝对必要的查询):

    mysql> CREATE TABLE foo(id INT PRIMARY KEY);
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB;
    

    我得到以下错误: 错误1005(hy000):无法创建表“./test/bar.frm”(错误号:150)

    我的错误在哪里?我盯着这个看了半个小时没找到他。

    7 回复  |  直到 7 年前
        1
  •  30
  •   Greg    17 年前

    从 FOREIGN KEY Constraints

    如果重新创建的表 删除,它必须有一个定义 符合外键的 引用它的约束。它必须 具有正确的列名和类型, 它必须在 参考钥匙,如前所述。如果 这些不满足,mysql返回 错误号1005,表示错误 错误消息中的150。

    我的 怀疑 是因为你没有创造 foo 就像InnoDB一样,其他一切看起来都很好。

    编辑:来自同一页-

    两个表都必须是InnoDB表,并且不能是临时表。

        2
  •  11
  •   Tommy Bravo    7 年前

    您可以使用命令 SHOW ENGINE INNODB STATUS 以获取有关错误的更具体信息。

    它会给你一个结果 Status 包含大量文本的列。

    查找名为“最新外键错误”的部分,例如:

    ------------------------
    LATEST FOREIGN KEY ERROR
    ------------------------
    190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
    Create  table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
        CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
        CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
    
        3
  •  4
  •   Suyash Jain    10 年前

    要创建外键,

    1. 主列和引用列的定义必须相同。
    2. 两个表引擎都必须是innodb。

    您可以使用此命令更改表的引擎,请在执行此命令之前进行备份。

    alter table[table name]engine=innodb;

        4
  •  1
  •   webmaster    13 年前

    我也有同样的问题,对于那些也有这个问题的人:

    检查被引用表的表名

    我忘了我桌名末尾的“S”

    例如,表客户机-->客户机

    :)

        5
  •  1
  •   Madhab Chandra Pal    12 年前

    除了许多其他导致mysql错误150的原因(使用innodb时),其中一个可能的原因是未定义 KEY 在包含在相对表中作为外键引用的列名称的表的create语句中。

    假设主表的create语句是-

    CREATE TABLE 'master_table' (
    'id' int(10) NOT NULL AUTO_INCREMENT,
    'record_id' char(10) NOT NULL,
    'name' varchar(50) NOT NULL DEFAULT '',
    'address' varchar(200) NOT NULL DEFAULT '',
    PRIMARY KEY ('id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    以及相对表的创建语法,其中外键约束是从主表设置的。-

    CREATE TABLE 'relative_table' (
    'id' int(10) NOT NULL AUTO_INCREMENT,
    'salary' int(10) NOT NULL DEFAULT '',
    'grade' char(2) NOT NULL DEFAULT '',
    'record_id' char(10) DEFAULT NULL,
    PRIMARY KEY ('id'),
    CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    如果使用innodb,这个脚本肯定会以mysql错误150结束。

    为了解决这个问题,我们需要添加一个 钥匙 为了专栏 record_id 在 master_table 表中的引用 relative_table 要用作外键的表。

    最后,为 主表 ,将-

    CREATE TABLE 'master_table' (
    'id' int(10) NOT NULL AUTO_INCREMENT,
    'record_id' char(10) NOT NULL,
    'name' varchar(50) NOT NULL DEFAULT '',
    'address' varchar(200) NOT NULL DEFAULT '',
    PRIMARY KEY ('id'),
    KEY 'record_id' ('record_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

        6
  •  0
  •   Hamed J.I    13 年前

    我也有同样的问题,原因是列的“排序规则”不同。一个是拉丁语1,另一个是utf8

        7
  •  0
  •   Ajay Sharma    11 年前

    如果在“references”关键字后没有给出正确的列名,也可能发生这种情况。