无法删除或更新父行:spring 没有级联的问题

Cannot delete or update a parent row: spring problem without cascade

java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (hrms.employees, CONSTRAINT FKe4i9i8vu1j96m71g4v98kqirb FOREIGN KEY (designation_id) REFERENCES designations (id))

我刚刚遇到这个问题,我尝试删除一个实体,但该实体与另一个实体有关系,另一个实体有另一个关系想象图片这是表格

当我想删除部门时如何从部门分离员工和名称。我可以删除代码中的名称,但我不想删除具有与部门和名称关联的外键的员工。


CREATE TABLE `departments` (
    `id` bigint NOT NULL AUTO_INCREMENT,
    `name` varchar(150) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `designations` (
    `id` bigint NOT NULL AUTO_INCREMENT,
    `department_name` varchar(40) DEFAULT NULL,
    `name` varchar(140) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `employees` (
    `id` bigint NOT NULL AUTO_INCREMENT,
    `address` varchar(255) NOT NULL,
    `dob` varchar(255) DEFAULT NULL,
    `email` varchar(35) NOT NULL,
    `employee_number` varchar(255) NOT NULL,
    `first_name` varchar(40) NOT NULL,
    `full_name` varchar(100) NOT NULL,
    `gender` varchar(255) DEFAULT NULL,
    `join_date` varchar(255) NOT NULL,
    `last_name` varchar(40) NOT NULL,
    `password` varchar(40) NOT NULL,
    `phone_number` varchar(255) NOT NULL,
    `username` varchar(255) NOT NULL,
    `department_id` bigint DEFAULT NULL,
    `designation_id` bigint DEFAULT NULL,
    `avatar_image` varchar(64) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `FKgy4qe3dnqrm3ktd76sxp7n4c2` (`department_id`),
    KEY `FKe4i9i8vu1j96m71g4v98kqirb` (`designation_id`),
    CONSTRAINT `FKe4i9i8vu1j96m71g4v98kqirb` 
        FOREIGN KEY (`designation_id`) 
        REFERENCES `designations` (`id`),
    CONSTRAINT `FKgy4qe3dnqrm3ktd76sxp7n4c2` 
        FOREIGN KEY (`department_id`) 
        REFERENCES `departments` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Spring 与您的问题完全无关。这完全是关于 MySQL 数据库以及您在 DDL 中定义表的方式。

如果您的数据库中存在子行,则不能删除父行,因为您定义该约束的方式。

有一个 ON DELETE .... 语法告诉 MySQL 当父行被删除时要做什么,默认情况下 MySQL 将拒绝删除,你可以在一个数字中更改它MySQL manual中指定的所有奇数位置的方法。

在您的情况下,您希望在删除部门时不删除员工,并且您有列

`department_id` bigint DEFAULT NULL,

定义为 DEFAULT NULL 然后如下更改您的 CONSTRAINT

CONSTRAINT `FKgy4qe3dnqrm3ktd76sxp7n4c2` 
        FOREIGN KEY (`department_id`) 
        REFERENCES `departments` (`id`)
    ON DELETE SET NULL

你当然也可以

CONSTRAINT `FKgy4qe3dnqrm3ktd76sxp7n4c2` 
        FOREIGN KEY (`department_id`) 
        REFERENCES `departments` (`id`)
    ON DELETE SET DEFAULT

在这种情况下两者都会做同样的事情,因为该列的默认值是 NULL