8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

MySQL 使用外键创建表时出现 errno:150

mskcc 1月前

213 0

我正在尝试在 MySQL 中创建一个具有两个外键的表,它们引用另外两个表中的主键,但是我收到了 errno:150 错误,并且它不会创建该表。这是...

我正在尝试在 MySQL 中创建一个具有两个外键的表,该外键引用其他两个表中的主键,但是我收到错误 errno: 150 并且无法创建该表。

以下是所有 3 个表的 SQL:

CREATE TABLE role_groups (
  `role_group_id` int(11) NOT NULL `AUTO_INCREMENT`,
  `name` varchar(20),
  `description` varchar(200),
  PRIMARY KEY (`role_group_id`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `roles` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50),
  `description` varchar(200),
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB;

create table role_map (
  `role_map_id` int not null `auto_increment`,
  `role_id` int not null,
  `role_group_id` int not null,
  primary key(`role_map_id`),
  foreign key(`role_id`) references roles(`role_id`),
  foreign key(`role_group_id`) references role_groups(`role_group_id`)
) engine=InnoDB;
帖子版权声明 1、本帖标题:MySQL 使用外键创建表时出现 errno:150
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由mskcc在本站《hibernate》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 必须满足这些条件才能不出现错误 150 ALTER TABLE ADD FOREIGN KEY

    1. p1

    2. p2

    3. p3

    4. p4

    5. p5

      p6

    6. p7

    7. p8

       SELECT COUNT(*) FROM Child LEFT OUTER JOIN Parent ON Child.FK = Parent.PK  WHERE Parent.PK IS NULL;

      p9

    8. p10

    9. p11

    10. p12

    11. p13

    12. p14

  • 还有一点值得补充:如果父表的PK不止一个字段,那么FK中字段的顺序必须与PK中的顺序相同

  • mpen 1月前 0 只看Ta
    引用 4

    这包括诸如 int(11) unsigned NOT NULL 与 int(11) NOT NULL 之类的内容。

  • 如果表定义为 ENGINE=MyISAM,则不会生成 errno 150,因为它忽略了外键声明。这就像说避免汽车引擎故障的最好方法是驾驶一艘船。:-)

  • 此外,如果您的 CONSTRAINT 的 ON DELETE 规则是 SET NULL,请确保外键实际上可以为 NULL!我花了 30 分钟反复阅读这个答案,确保我的表满足条件,但仍然收到错误 150。然后我注意到我的 FK 是一个 NOT NULL 字段,这意味着该规则无法应用。

  • MySQL 的通用“errno 150”消息“ 表示外键约束未正确形成 ”。如果您正在阅读此页面,您可能已经知道,通用“errno:150”错误消息确实毫无帮助。但是:

    您可以通过运行 SHOW ENGINE INNODB STATUS; 然后在输出中查找 LATEST FOREIGN KEY ERROR 来获取实际的错误消息。

    例如,尝试创建外键约束:

    CREATE TABLE t1
    (id INTEGER);
    
    CREATE TABLE t2
    (t1_id INTEGER,
     CONSTRAINT FOREIGN KEY (t1_id) REFERENCES t1 (id));
    

    失败并显示错误 Can't create table 'test.t2' (errno: 150) 。除了这是一个外键问题之外,这并没有告诉任何人任何有用的信息。但运行 SHOW ENGINE INNODB STATUS; 它会说:

    ------------------------
    LATEST FOREIGN KEY ERROR
    ------------------------
    130811 23:36:38 Error in foreign key constraint of table test/t2:
    FOREIGN KEY (t1_id) REFERENCES t1 (id)):
    Cannot find an index in the referenced table where the
    referenced columns appear as the first columns, or column types
    in the table and the referenced table do not match for constraint.
    

    它说问题是找不到索引。 SHOW INDEX FROM t1 显示表 根本没有任何索引 t1 。通过在 上定义主键来修复该问题 t1 ,外键约束将成功创建。

  • SHOW ENGINE INNODB STATUS 帮助我立即识别出我花了近一个小时试图诊断的问题。谢谢。

  • tink 1月前 0 只看Ta
    引用 9

    在我的例子中,这表明一个完全不同的表与我试图指向的相同字段不一致,因此无法保存新字段……假设这是由于在导入/更改过程中使用了 SET FOREIGN_KEY_CHECKS = 0;,而导入/更改在某个时间出现格式错误。非常感谢,帮了大忙。

  • 确保您尝试通过约束链接的两个字段的属性完全相同。

    通常,ID 列上的“无符号”属性会让你陷入困境。

    ALTER TABLE `dbname`.`tablename` CHANGE `fieldname` `fieldname` int(10) UNSIGNED NULL;
    
  • 根据我的经验,值得在主表上使用 MySQL 的 SHOW CREATE TABLE 来准确检查针对主索引列设置的标志,然后将它们复制到外键列。那里可能有一些不明显的内容,例如 \'unsigned\'。

  • 运行此脚本时,数据库的当前状态是什么?数据库完全是空的吗?从头开始创建数据库时,您的 SQL 运行正常,但 errno 150 通常与删除并重新创建属于外键的表有关。我感觉您使用的不是 100% 全新的数据库。

    如果在对 SQL 文件进行“source”操作时出现错误,您应该能够在“source”命令之后立即从 MySQL 提示符运行命令“SHOW ENGINE INNODB STATUS”以查看更详细的错误信息。

    您可能还想查看手动输入:

    如果重新创建已删除的表,则该表必须具有符合引用它的外键约束的定义。它必须具有正确的列名和类型,并且必须具有引用键上的索引,如前所述。如果不满足这些条件,MySQL 将返回错误号 1005 并在错误消息中引用错误 150。如果 MySQL 从 CREATE TABLE 语句报告错误号 1005,并且错误消息引用错误 150,则表创建失败,因为外键约束未正确形成。

    MySQL 5.1 参考手册 .

  • 对于正在查看此主题并遇到相同问题的人:

    出现此类错误的原因有很多。有关 MySQL 中外键错误的原因和解决方案的完整列表(包括此处讨论的),请查看此链接:

    MySQL 外键错误和 Errno 150

  • 对于通过 Google 找到此 SO 条目的其他人:请确保您没有尝试对定义为 \'NOT NULL\' 的外键列执行 SET NULL 操作。这会造成很大的挫败感,直到我记得执行 CHECK ENGINE INNODB STATUS。

  • hwnd 1月前 0 只看Ta
    引用 15

    当然不是,但我发现这个错误很常见且不明显。 a 的目标 FOREIGN KEY 可能不是 PRIMARY KEY 。对我有用的答案是:

    FOREIGN KEY 必须始终指向其他表的 PRIMARY KEY 真实字段。

    CREATE TABLE users(
       id INT AUTO_INCREMENT PRIMARY KEY,
       username VARCHAR(40));
    
    CREATE TABLE userroles(
       id INT AUTO_INCREMENT PRIMARY KEY,
       user_id INT NOT NULL,
       FOREIGN KEY(user_id) REFERENCES users(id));
    
  • 正如@andrewdotn 所指出的,最好的方法是查看详细的错误( SHOW ENGINE INNODB STATUS; ),而不仅仅是错误代码。

    其中一个原因可能是另一个表中已经存在同名的索引。作为一种惯例,我建议在索引名称之前添加表名称前缀,以避免此类冲突。例如,不要 idx_使用rId use idx_userActionMapping_userId .

  • 请首先确保

    1. 您正在使用 InnoDB 表。
    2. FOREIGN KEY 字段具有与源字段相同的类型和长度(!)。

    我遇到了同样的问题,我已经解决了。我在一个字段中使用了无符号 INT,而在另一个字段中使用了整数。

  • 有用的提示, SHOW WARNINGS; 尝试 CREATE 查询后使用,您将收到错误以及更详细的警告:

        ---------------------------------------------------------------------------------------------------------+
    | Level   | Code | Message                                                                                                                                                                                                                                 |
    +---------+------+--------------------------------------------------------------------------                          --------------------------------------------------------------------------------------------                          ---------------+
    | Warning |  150 | Create table 'fakeDatabase/exampleTable' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns.
    |
    | Error   | 1005 | Can't create table 'exampleTable' (errno:150)                                                                                                                                                                           |
    +---------+------+--------------------------------------------------------------------------                          --------------------------------------------------------------------------------------------                          ---------------+
    

    因此在这种情况下,是时候重新创建我的表了!

  • pkr 1月前 0 只看Ta
    引用 19

    这通常发生在您尝试将源文件放入现有数据库时。首先删除所有表(或数据库本身)。然后删除 SET foreign_key_checks = 0; 开头和 SET foreign_key_checks = 1; 结尾带有的源文件。

  • 我发现了失败的另一个原因......区分大小写的表名。

    对于此表定义

    CREATE TABLE user (
      userId int PRIMARY KEY AUTO_INCREMENT,
      username varchar(30) NOT NULL
    ) ENGINE=InnoDB;
    

    此表定义有效

    CREATE TABLE product (
      id int PRIMARY KEY AUTO_INCREMENT,
      userId int,
      FOREIGN KEY fkProductUser1(userId) REFERENCES **u**ser(userId)
    ) ENGINE=InnoDB;
    

    而这个失败了

    CREATE TABLE product (
      id int PRIMARY KEY AUTO_INCREMENT,
      userId int,
      FOREIGN KEY fkProductUser1(userId) REFERENCES User(userId)
    ) ENGINE=InnoDB;
    

    事实上,它在 Windows 上可以运行,但在 Unix 上却不行,我花了几个小时才弄清楚。希望这对其他人有帮助。

返回
作者最近主题: