SQL外键约束报错(Error 1822):缺失引用表索引的修正方法咨询
解决外键约束添加失败(Error Code: 1822)的问题
这个报错我太熟了!咱们先搞明白为啥会出问题,再给你解决办法~
报错原因拆解
MySQL有个硬性要求:外键要引用的字段,必须在被引用的表里是索引字段(主键本身就是索引,所以最常用)。你当前的SQL里,Employee表的DID只是普通的非索引字段,MySQL不允许基于无索引的字段创建外键约束,所以抛出了这个“Missing index”的错误。
另外悄悄说一句:你的外键关联逻辑搞反啦!正常业务场景里,应该是「员工属于某个部门」,所以应该是员工表的DID(部门ID)去关联部门表的主键,反过来让部门表依赖员工表的字段,逻辑上其实说不通哦。
修正方案(符合业务逻辑的正确写法)
咱们先把关联方向掰正,同时满足MySQL的索引要求:
CREATE DATABASE Company; USE Company; -- 先建部门表(主表),因为员工表要依赖它 CREATE TABLE Department( DepartmentID INT PRIMARY KEY, -- 主键自动生成索引,满足外键引用要求 DepartmentName CHAR(25) ); -- 再建员工表,外键关联部门表的主键 CREATE TABLE Employee( EmployeeID INT PRIMARY KEY, EmployeeName CHAR(25), DID INT NOT NULL, FOREIGN KEY (DID) REFERENCES Department(DepartmentID) );
如果真的有特殊需求要保留原关联方向(不推荐)
要是你确实有特殊业务场景必须让部门表引用员工表的DID,那只要给Employee的DID加个索引就行:
CREATE DATABASE Company; USE Company; CREATE TABLE Employee( EmployeeID INT PRIMARY KEY, EmployeeName CHAR(25), DID INT NOT NULL, INDEX idx_did (DID) -- 给DID字段添加索引,满足外键约束要求 ); CREATE TABLE Department( DepartmentID INT NOT NULL, DepartmentName CHAR(25), FOREIGN KEY (DepartmentID) REFERENCES Employee(DID) );
还是得提醒一句,第二种写法的业务逻辑很反常,除非你有特别的理由,不然强烈建议用第一种符合常规业务逻辑的方案哦!
内容的提问来源于stack exchange,提问作者Kirti Purohit
相关产品推荐
相关产品推荐

