外键约束On删除级联无效

时间:2019-08-19 13:27:33

标签: mysql foreign-keys cascading-deletes

我创建了两个表(emp和dept)。 Emp包含一个外键(肽)。我试图从dept表中删除一行,并收到一个外键约束错误。然后,我更改了emp表外键以添加约束并在级联上删除。代码复制到这里

create table dept (
  deptid int primary key,
  deptname varchar(20),
  locid int);

create table emp (
  empid int primary key,
  frname varchar(15),
  lname varchar(20),
  hiredate datetime,
  deptid int,
  foreign key (deptid) references dept(deptid));

alter table emp add constraint fk_deptid foreign key (deptid) 
    references dept(deptid) on delete cascade;

这是我收到的错误消息:

  

查询错误:错误:ER_ROW_IS_REFERENCED_2:无法删除或更新父行:外键约束失败(testemp,CONSTRAINT emp_ibfk_1外键(deptid )参考deptdeptid))

1 个答案:

答案 0 :(得分:0)

问题是您要为同一列创建两个外键约束。避免这样做,这很令人困惑。

  • 第一个是在创建表时创建的,未命名为 。由于您没有提供名称,因此MySQL会自动为您命名为emp_ibfk_1。该没有没有CASCADE DELETE,可以防止删除父键。

  • 第二个是在单独的SQL语句上,您将其命名为fk_deptid。该具有 CASCADE DELETE,并允许删除父键。

在执行外键约束时,MySQL不能删除该行,因为第一个约束不允许该行。那就是你得到的错误。

这是一个令人困惑的情况,我会避免这样做。我建议对列使用单个FK约束;具体来说,我将删除第一个。

例如:

create table dept (
  deptid int primary key,
  deptname varchar(20),
  locid int);

create table emp (
  empid int primary key,
  frname varchar(15),
  lname varchar(20),
  hiredate datetime,
  deptid int
  -- , foreign key (deptid) references dept(deptid) -- removed
);

alter table emp add constraint fk_deptid foreign key (deptid) 
    references dept(deptid) on delete cascade;

insert into dept (deptid, deptname, locid) 
  values (1, 'Math', 123);    

insert into emp (empid, frname, lname, hiredate, deptid) 
  values (10, 'Peter', 'Fonda', null, 1);

delete from dept where deptid = 1; -- works!