1
votes

Comment SUPPRIMER dans mysql sans supprimer les contraintes primaires et étrangères

Je veux supprimer un enregistrement à l'intérieur de employee_id, par exemple

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
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) );

Voici le message d'erreur que j'ai reçu

DELETE FROM EMPLOYEE WHERE employee_id = 114;


0 commentaires

3 Réponses :


0
votes

Vous pouvez désactiver temporairement puis activer en utilisant l'instruction ci-dessous.

Pour désactiver:

set foreign_key_checks = 1;

POUR Activer:

set foreign_key_checks = 0;


1 commentaires

Je ne recommande pas cette solution. Vous vous retrouverez avec de fausses données dans votre base de données, car certaines lignes auront des clés étrangères référençant la ligne que vous avez supprimée.



2
votes

Pour supprimer l'enregistrement de l'employé sans supprimer la clé étrangère, vous devez d'abord METTRE À JOUR toutes les lignes de votre table Department qui font référence à cet id_employé.

UPDATE Employee SET supervisor_id = ? WHERE supervisor_id = ?;

Mettez également à jour toutes les lignes de Employé qui font référence à celle-ci. que vous souhaitez supprimer en tant que superviseur_id.

UPDATE Department SET manager_id = ? WHERE manager_id = ?;

Une fois qu'aucune ligne dans Department ou Employee ne fait référence à cet employee_id spécifique, vous pouvez SUPPRIMER la ligne dans la table Employee.


0 commentaires

0
votes

Vous pouvez passer à une suppression en cascade. Mais le renvoi du superviseur déclenche également tous ses rapports.

Vous pourriez abandonner les FOREIGN KEYs à cause des tracas. Mais alors vous perdez les avantages.

Vous devriez d'abord changer tous les employés qui relèvent de lui pour les faire pointer ailleurs? Peut-être NULL? Puis supprimez le superviseur.

Regardez les choses de cette façon. Le FK vous a surpris en train de gâcher l'intégrité de la base de données. Soit la vérification d'intégrité est erronée, soit le processus (suppression du superviseur) était erroné.


0 commentaires