错误1822(HY000):无法添加外键约束。 SQL中约束问题的索引缺失

时间:2020-11-07 08:16:15

标签: mysql sql

我通过创建3个表(classes, lectures, taking)来创建数据库,然后依次更改表以添加foreign key

但是,我不断收到以下错误: ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint

我似乎未发现代码有任何问题,所以可能是什么问题?? (我使用的是mySQL Workbench。我尝试将复制和粘贴作为txt文件,因为我虽然可能是排序规则问题,但仍然会出现相同的问题)

代码如下:

CREATE TABLE classes (
    course_id VARCHAR(8),
    classes_id VARCHAR(10),
    semester VARCHAR(10),
    year VARCHAR(10),
    PRIMARY KEY (course_id, classes_id, semester, year)
);

CREATE TABLE taking (
    student_id VARCHAR(8),
    course_id VARCHAR(10),
    classes_id VARCHAR(10),
    semester VARCHAR(10),
    year VARCHAR(10),
    grade char(1),
    PRIMARY KEY (student_id, course_id, semester, year)
);

CREATE TABLE lectures (
    professor_id VARCHAR(8),
    course_id VARCHAR(10),
    classes_id VARCHAR(10),
    semester VARCHAR(10),
    year VARCHAR(10),
    PRIMARY KEY (professor_id, course_id, semester, year)
);

ALTER TABLE taking ADD CONSTRAINT consTAKE3 FOREIGN KEY(classes_id) REFERENCES classes(classes_id) ON DELETE CASCADE;
ALTER TABLE taking ADD CONSTRAINT consTAKE4 FOREIGN KEY(semester) REFERENCES classes(semester) ON DELETE CASCADE;
ALTER TABLE taking ADD CONSTRAINT consTAKE5 FOREIGN KEY(year) REFERENCES classes(year) ON DELETE CASCADE;

ALTER TABLE lectures ADD CONSTRAINT consLEC3 FOREIGN KEY(classes_id) REFERENCES classes(classes_id) ON DELETE CASCADE;
ALTER TABLE lectures ADD CONSTRAINT consLEC4 FOREIGN KEY(semester) REFERENCES classes(semester) ON DELETE CASCADE;
ALTER TABLE lectures ADD CONSTRAINT consLEC5 FOREIGN KEY(year) REFERENCES classes(year) ON DELETE CASCADE;

错误如下:

ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consTAKE3' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consTAKE4' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consTAKE5' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consLEC3' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consLEC4' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consLEC5' in the referenced table 'classes'

现在,我正在尝试使用cmdysql –u root –p执行此操作。尽管如此,同样的问题仍在发生。

2 个答案:

答案 0 :(得分:0)

由于所有表中都有一个复合主键,因此所有引用也必须包括表中的所有复合键列才能正确映射。

除非每个表的复合主键列上都有唯一的约束/索引。

要在表中创建关系,请对dbo.taking进行尝试,对其他表也要采用类似的方法

ALTER TABLE dbo.taking 
  ADD CONSTRAINT FK_taking_classes
  FOREIGN KEY(course_id, classes_id, semester, year) REFERENCES classes(course_id, 
classes_id, semester, year)

答案 1 :(得分:-1)

两个表中course_id的字符长度不同,这导致未创建FK。请在与varchar(8)相同的taking表中将其设置为classes。肯定会解决问题。通过使用提供的查询,我已经创建了表,并且也有FK。

然后遵循上述查询:

由于所有表中都有复合主键,因此所有 引用还必须在 表格以正确映射。

除非您在复合主键上具有唯一的约束/索引 每个表格上的列。

要在表中创建关系,请对dbo.taking进行尝试,请按照 其他表也有类似的方法

  ALTER TABLE dbo.taking 
  ADD CONSTRAINT FK_taking_classes
  FOREIGN KEY(course_id, classes_id, semester, year) REFERENCES classes(course_id, 
  classes_id, semester, year)