我创建了两个表(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:无法删除或更新父行:外键约束失败(
test
。emp
,CONSTRAINTemp_ibfk_1
外键(deptid
)参考dept
(deptid
))
答案 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!