首页 > 解决方案 > 错误代码:1822。添加外键约束失败。引用表 'category' 中的约束 'questions_ibfk_1' 缺少索引

问题描述

无法向表添加外键约束

create table users
(
user_id int  auto_increment  primary key  not null,
username varchar(50)    unique null ,
email varchar(50)   unique  ,
passwords varchar(50) not null,
login_status boolean not null  
);

create table category (
 category_id int  primary key not  null,
 category_name varchar(50) not null
 );

 create table answers (
id_answer int  auto_increment  primary key not null,
answer boolean  not null
);

create table questions  ( 
question_id int primary key not null,
 category_name varchar(50) not null,
content varchar(50) not null ,
 foreign key (category_name) references category (category_name)
 );

标签: mysql-workbench

解决方案


category_name您收到此错误是因为表中没有索引category。将该语句更改CREATE如下:

create table category (
 category_id int  primary key not  null,
 category_name varchar(50) not null,
 KEY category_name_index (category_name)
 );

来自文档(8.0 版本,但该声明适用于旧版本):

MySQL 需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会在引用表上自动创建此类索引。如果您创建另一个可用于强制外键约束的索引,则此索引可能会在稍后被静默删除。index_name,如果给定,则如前所述使用。

此外,您使用 avarchar(50)作为外键,由于各种原因,这通常不是一个好主意。您可能想要使用数值,例如category_id, 。


推荐阅读