首页 > 解决方案 > 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,但其他表包括在内以防万一。

我看过这里,大多数答案都表明主键/外键之间存在类型不匹配,或者我试图做的引用是针对不唯一的字段。但是,所有类型似乎都匹配,我相信我只是在引用肯定是隐式唯一的主键字段?任何帮助,将不胜感激。

标签: mysqlsql

解决方案


您的文章主键是:

PRIMARY KEY (FirstPage, LastPage, Month, Year, ISSN)

外键引用是:

FOREIGN KEY (ISSN, Month, Year, FirstPage, LastPage)

这些列的顺序不同。它们需要以相同的顺序排列。

也就是说,5 部分复合主键似乎是数据库的噩梦。引入一个自动递增的articleId并只使用:

FOREIGN KEY (articleId) REFERENCES articles (articleId)

推荐阅读