在MariaDB下MySQL的奇怪外键错误

时间:2017-07-15 22:08:10

标签: mysql sql database mysql-workbench mariadb

对于某些情况,我正在为discord创建一个javascript bot,我正在创建一个大型数据库,以便我可以记录许多不同的信息。

使用数据库的这一部分,以便我可以

  1. 存储消息
  2. 存储历史消息,每次编辑
  3. 轻松查找这些历史消息中提及的用户。
  4. 我在arch linux下使用MariaDB和MySQL Workbench。 Here's the relevant part of the database design, done on dbdesigner.net. 问题发生在最左边的表格中。

    这是我的错误信息:

      

    在第158行完成执行脚本ERROR 1005(HY000):不能   create table test#sql-1bb_6(错误:150"外键约束   形成错误")exitcode 1操作失败

    所以我知道我的外键在158处有问题,但我找不到问题。

    ALTER TABLE `messageContentHistoryMentions` 
        ADD CONSTRAINT `messageContentHistoryMentions_fk1` 
            FOREIGN KEY (`messageContentCount`) REFERENCES `messageContentHistory`(`messageContentCount`);  
    

    令我困惑的部分是158的格式与第156行完全相同,只有不同的字段。下面的第156行运行:

    ALTER TABLE `messageContentHistoryMentions` 
        ADD CONSTRAINT `messageContentHistoryMentions_fk0` 
            FOREIGN KEY (`messageID`) REFERENCES `messageContentHistory`(`messageID`);
    

    你可能理解为什么我很困惑。
    更多信息:

    • 这是MariaDB的新安装,因此假定为默认值
    • InnoDB是正在使用的引擎
    • 这些表格都有utf8mb4_unicode_ci
    • 的排序规则
    • 外键的两边都是主键,是整数,长度为8,默认为0.

    感谢。
    编辑:这不是重复,因为错误是相似的,它所处的情况是非常不同的

1 个答案:

答案 0 :(得分:0)

在您的案例messageContentHistory中,引用的表格必须有一个索引,其中引用的列(在您的案例中为messageContentCount)列为第一个列(在给定的顺序)。根据模式,messageContentCount是主键的一部分,但不是第一部分。 messageID 主键的最左边部分,这就是它适用于它的原因。

尝试在messageContentCount上添加另一个索引:

ALTER TABLE messageContentHistory ADD KEY (messageContentCount);

之后它应该可以工作。

或者,如果它适合您的目的,您可以在(messageIDmessageContentCount)上添加一个外键,而不是两个单独的外键。它也应该工作,因为在这种情况下,条件将得到满足。

MariaDB KB for foreign keys(有趣的部分是子表中的列必须是索引......