如何在mysql中删除而不删除主要和外部约束

时间:2019-11-04 04:06:19

标签: mysql foreign-keys

例如,我要删除employee_id中的一条记录

DELETE FROM EMPLOYEE WHERE employee_id = 114;

CREATE TABLE EMPLOYEE(
employee_id    DECIMAL(6)     NOT NULL,
first_name     VARCHAR(20)  NOT NULL,
last_name      VARCHAR(25)  NOT NULL,
email          VARCHAR(25)      NULL,
phone_number   VARCHAR(20)      NULL,
hire_date      DATE     NOT NULL,
job_title      VARCHAR(35)  NOT NULL,
salary         DECIMAL(8,2)     NULL,
commission_pct DECIMAL(2,2)     NULL,
supervisor_id     DECIMAL(6)        NULL,
department_name VARCHAR(30)     NULL,
CONSTRAINT EMPLOYEE_PK PRIMARY KEY(employee_id),
CONSTRAINT EMPLOYEE_CK1 UNIQUE(email),
CONSTRAINT EMPLOYEE_CK2 UNIQUE(phone_number),
CONSTRAINT EMPLOYEE_FK1 FOREIGN KEY(department_name)
       REFERENCES DEPARTMENT(department_name),
CONSTRAINT EMPLOYEE_FK2 FOREIGN KEY(supervisor_id)
       REFERENCES EMPLOYEE(employee_id),
CONSTRAINT EMPLOYEE_FK3 FOREIGN KEY(job_title)
       REFERENCES JOB(job_title),
CONSTRAINT EMPLOYEE_CH1 CHECK (salary > 0) );

ALTER TABLE DEPARTMENT
ADD ( CONSTRAINT DEPARTMENT_FK2 FOREIGN KEY(manager_id)
             REFERENCES EMPLOYEE(employee_id) );

这是我收到的错误消息

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

有什么想法可以在不更改或删除约束的情况下删除记录吗?

3 个答案:

答案 0 :(得分:2)

要删除雇员记录而不删除外键,您应该首先更新Department表中任何引用该employee_id的行。

UPDATE Department SET manager_id = ? WHERE manager_id = ?;

还要更新Employee中所有要删除的行作为supervisor_id的行。

UPDATE Employee SET supervisor_id = ? WHERE supervisor_id = ?;

一旦Department或Employee中没有引用该特定employee_id的行,则可以删除Employee表中的行。

答案 1 :(得分:0)

您可以使用以下语句暂时禁用然后启用。

要禁用:

set foreign_key_checks = 0;

启用:

set foreign_key_checks = 1;

答案 2 :(得分:0)

您可以更改为级联删除。但是随后解雇主管也会解雇他的所有报告。

由于麻烦,您可以放弃FOREIGN KEYs。但是随后您就失去了好处。

应该首先更改所有向他报告的员工,让他们指向其他地方?也许为空? 然后删除主管。

这样看。 FK抓住了您尝试破坏数据库完整性的麻烦。完整性检查错了,或者流程(删除主管)错了。