mysql - MySQL缺少约束索引
问题描述
我正在尝试在 MySQL 中创建一些表,但遇到了一个错误,我在这里找不到答案。这是我正在尝试创建的表(为了便于阅读而缩进):
CREATE TABLE Journal (ISSN INT NOT NULL, ChiefEditor VARCHAR(20) NOT NULL,
JournalTitle VARCHAR(20) NOT NULL, PRIMARY KEY(ISSN));
CREATE TABLE Volume (Year INT NOT NULL, ISSN INT NOT NULL,
PRIMARY KEY(Year, ISSN), FOREIGN KEY (ISSN) REFERENCES Journal(ISSN));
CREATE TABLE Edition (Month INT NOT NULL, Year INT NOT NULL, ISSN INT NOT NULL,
FirstPage INT, LastPage INT, PRIMARY KEY(Month, Year, ISSN),
FOREIGN KEY (Year, ISSN) REFERENCES Volume(Year, ISSN));
CREATE TABLE Article (FirstPage INT NOT NULL, LastPage INT NOT NULL, Month INT NOT NULL,
Year INT NOT NULL, ISSN INT NOT NULL, ArticleTitle VARCHAR(50), Abstract VARCHAR(1000),
PDFPath VARCHAR(50), PRIMARY KEY(FirstPage, LastPage, Month, Year, ISSN),
FOREIGN KEY (Month, Year, ISSN) REFERENCES Edition(Month, Year, ISSN));
CREATE TABLE User (Email VARCHAR(30) NOT NULL, Title VARCHAR(15), Forename VARCHAR(20),
Surname VARCHAR(30), University VARCHAR(30), Password VARCHAR(40),
IsEditor BOOLEAN, IsAuthor BOOLEAN, IsReviewer BOOLEAN, PRIMARY KEY(Email));
CREATE TABLE ArticleAuthor (Email VARCHAR(30) NOT NULL, ISSN INT NOT NULL,
Month INT NOT NULL, Year INT NOT NULL, FirstPage INT NOT NULL, LastPage INT NOT NULL,
PRIMARY KEY(Email, ISSN, Month, Year, FirstPage, LastPage), FOREIGN KEY (Email)
REFERENCES User(Email), FOREIGN KEY (ISSN, Month, Year, FirstPage, LastPage)
REFERENCES Article(ISSN, Month, Year, FirstPage, LastPage));
当我运行此代码时,MySQL 显示:
错误代码:1822。添加外键约束失败。引用表“article”中的约束“articleauthor_ibfk_2”缺少索引
有问题的表似乎是 ArticleAuthor 和 Author,但其他表包括在内以防万一。
我看过这里,大多数答案都表明主键/外键之间存在类型不匹配,或者我试图做的引用是针对不唯一的字段。但是,所有类型似乎都匹配,我相信我只是在引用肯定是隐式唯一的主键字段?任何帮助,将不胜感激。
解决方案
您的文章主键是:
PRIMARY KEY (FirstPage, LastPage, Month, Year, ISSN)
外键引用是:
FOREIGN KEY (ISSN, Month, Year, FirstPage, LastPage)
这些列的顺序不同。它们需要以相同的顺序排列。
也就是说,5 部分复合主键似乎是数据库的噩梦。引入一个自动递增的articleId
并只使用:
FOREIGN KEY (articleId) REFERENCES articles (articleId)
推荐阅读
- docker-desktop - 如何让 Mac 上的 Docker Desktop 指向 VM 映像的新位置?
- javascript - 用动态数据反应图像滑块,第一个图像出现在 clickEvent 之后
- android - 当我输入这个时,它给了我“以下函数都不能用提供的参数调用。”
- python - Tensorflow 卷积神经网络负维度大小
- swift - 我有一个复杂的 UIView 层次结构,我需要做一个非常简单的操作,在子视图上设置背景颜色。任何可能的解决方案?
- python - 如何从列表创建列表
- gdb - 为 GDB 命令脚本分配唯一 ID
- gridsearchcv - 尽管有这个错误,我如何在 dast_ml 中运行 GridSearchCV?
- android - 如何在单个活动中使用片段中的主要活动浮动操作按钮?
- ios - 无法在 List ForEach 中以编程方式激活 NavigationLink