首页 > 技术文章 > mysql学习问题-Cannot delete or update a parent row

shishibuwan 2019-05-14 14:51 原文

执行语句:DELETE FROM t_dept WHERE dept_no = '30';报错

 Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t_employee`, CONSTRAINT `t_employee_ibfk_1` FOREIGN KEY (`dept_no`) REFERENCES `t_dept` (`dept_no`))

 

原因:MySQL设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况

 

SET FOREIGN_KEY_CHECKS = 0 //关闭外键约束

进行完操作后记得再把外键约束重新打开;

SET  FOREIGN_KEY_CHECKS = 1 //打开外键约束

 

DROP TABLE t_dept;
CREATE TABLE t_dept(
    dept_id INT(3) PRIMARY KEY,
    dept_no INT UNIQUE NOT NULL,
    dept_name VARCHAR(20) NOT NULL
);

DROP TABLE t_employee;
CREATE TABLE t_employee(
    emp_id INT(3) PRIMARY KEY,
    emp_no INT(3) UNIQUE NOT NULL,
    emp_name VARCHAR(10) NOT NULL,
    emp_age tinyint(4) NOT NULL DEFAULT 25 CHECK (emp_age BETWEEN 20 AND 60),
    sex VARCHAR(1) CHECK (sex in ('','')),
    job VARCHAR(20),
    sal INT(10),
    -- inline写法
    -- REFERENCES 主表(主表字段)
    -- dept_no int  REFERENCES t_dept(dept_no)

    -- outline写法
    dept_no int NOT NULL,
    FOREIGN KEY(dept_no) REFERENCES t_dept(dept_no)
);

insert into t_dept values(1,10,'IT技术部门');
insert into t_dept values(2,20,'市场部');
insert into t_dept values(3,30,'人事部');

-- 再插入员工数据
INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
VALUES(1,1,'张三',25,'','软件开发',8500,10);
INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
VALUES(2,102,'张天三',29,'','初级软件开发',4500,10);
INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
VALUES(3,103,'张一',36,'','测试人员',7500,10);
INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
VALUES(4,104,'王张三',63,'','人事主管',12500,20);
INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
VALUES(5,105,'发呆张三',60,'','高级程序员',18500,10);
INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
VALUES(6,106,'快乐张三',30,'','销售经理',10500,30);

SELECT * FROM t_employee;
SELECT * FROM t_dept;
-- MySQL设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。
-- Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t_employee`, CONSTRAINT `t_employee_ibfk_1` FOREIGN KEY (`dept_no`) REFERENCES `t_dept` (`dept_no`))
DELETE FROM t_dept WHERE dept_no = '30';

SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM t_dept WHERE dept_no = '30';
-- 删除完后记得外键约束重新打开;
SET FOREIGN_KEY_CHECKS = 1;

 

推荐阅读