2017-07-15 47 views
0

对于某些上下文,我创建了一个不协调的JavaScript bot,并且我创建了一个大型数据库,这样我可以记录许多不同的信息。MariaDB下的MySQL奇怪的外键错误

数据库的这部分是用来让我可以

  1. 存储消息
  2. 存储历史信息,与每一个编辑
  3. 容易查找哪些用户在这些历史的消息中提到的。

我在arch linux下使用MariaDB和MySQL Workbench。 Here's the relevant part of the database design, done on dbdesigner.net. 问题发生在最左边的表格。

这是我的错误信息:

收于线158执行脚本错误1005(HY000):无法创建 表test#sql-1bb_6(错误:150“外键约束 格式不正确”)操作失败,退出码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.

谢谢。
编辑:这是不是重复的,而错误是相似的,它是在情况很不同

+0

150往往意味着约束被在错误的顺序应用。 –

+0

请参见[mysql外键约束错误地形成错误](https://stackoverflow.com/questions/8434518/mysql-foreign-key-constraint-is-incorrectly-formed-error) – joanolo

+0

[mysql外键约束错误地形成错误](https://stackoverflow.com/questions/8434518/mysql-foreign-key-constraint-is-incorrectly-formed-error) – joanolo

回答

0

被引用的表,你的情况messageContentHistory,必须有一个索引,其中引用的列,你的情况messageContentCount ,列为第一个列(按给定顺序)。根据模式,messageContentCount是主键的一部分,但不是第一部分。 messageID主键的最左边部分,这就是为什么它适用于它。

尝试添加上messageContentCount另一个指标:

ALTER TABLE messageContentHistory ADD KEY (messageContentCount); 

应该以后的工作。

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

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

+0

非常感谢!我用你的建议(messageID,messageContentCount)。这解决了第158行的问题,后来在第164行发现了相同的错误。 – Sobeston