2017-09-01 2 views
1

J'ai 2 tables, une pour les employés et une autre pour les départements. Un département peut avoir des employés multiples/différents mais un employé ne peut travailler que dans un département. Leur relation est un à plusieurs.MySQL - Suppression de ligne sur une table ne met pas à jour la relation à l'autre table

Tableau de créations:

CREATE TABLE IF NOT EXISTS department(
    id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) NOT NULL UNIQUE, 
    street VARCHAR(255) NOT NULL, 
    employees_count INT(20) DEFAULT '0') 
ENGINE=INNODB; 

CREATE TABLE IF NOT EXISTS employee(
    id INT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    first_name VARCHAR(255) NOT NULL, 
    last_name VARCHAR(255) NOT NULL, 
    email VARCHAR(255) NOT NULL, 
    born INT(20) NOT NULL, 
    country VARCHAR(255) NOT NULL, 
    department_name VARCHAR(255) NOT NULL, 
    FOREIGN KEY (department_name) REFERENCES department(name) 
    ON UPDATE CASCADE ON DELETE CASCADE) 
ENGINE=INNODB; 

Tableau Insertions:

INSERT INTO department(name,street) VALUES ('Alexandroupoli', 'Leoforos Dimokratias21'); 
INSERT INTO department(name,street) VALUES ('Athens','Basilisis Sofias 111'); 
INSERT INTO department(name,street) VALUES ('Patras','Smurnis 34'); 
INSERT INTO department(name,street) VALUES ('Kalamata','Leoforos Fountas 241'); 
INSERT INTO department(name,street) VALUES ('Heraklion','Leoforos Enetwn 132'); 
INSERT INTO department(name,street) VALUES ('Thessaloniki','Karolou 45'); 
INSERT INTO department(name,street) VALUES ('Xanthi','Agia Barbasa 68'); 
INSERT INTO department(name,street) VALUES ('Larisa','Hroon Polutexneiou 12'); 

INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Vaggelis','Michos','[email protected]','1995','Greece','Athens'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('James','Gunn','[email protected]','1970','USA','Athens'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('George','McMahon','[email protected]','1978','Usa','Patras'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('John','Jones','[email protected]','1992','England','Patras'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Marinos','Kuriakopoulos','[email protected]','1986','Greece','Alexandroupoli'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Dimitris','Nikolaou','[email protected]','1984','Greece','Larisa'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Soufiane','El Kaddouri','[email protected]','1974','France','Xanthi'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Maria','Apostolou','[email protected]','1997','Greece','Larisa'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Ioannis','Marinou','[email protected]','1982','Greece','Kalamata'); 
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Thanasis','Athanasiou','[email protected]','1989','Cyprus','Heraklion'); 

UPDATE department SET employees_count = (SELECT COUNT(*) FROM employee WHERE department.name = employee.department_name); 

enter image description here

enter image description here

Lors de la création des deux tables et de la création d'une contrainte de clé étrangère entre elles, lorsque je supprime un département de la table des départements, chaque employé assosié est également supprimé, comme je le souhaite. MAIS, lorsque je supprime un employé de la table employee, la ligne employees_count du département ne change pas. Par exemple, si j'ai 2 employés avec un department_name = Athens, puis en supprimant l'un d'entre eux, quand je vais à la table departments, le nombre de employees reste égal à 2 au lieu de 1.

La même chose se produit lors de la mise à jour de department_name dans table des employés. Si pour un employé, je mets à jour son nom de département de "Athènes" à "Patras", la table de département reste inchangée.

Je pensais, après que je supprimer un employé, peut-être exécuter aussi cette commande

UPDATE department SET employees_count = (SELECT COUNT(*) FROM employee WHERE department.name = employee.department_name); 

et ce serait certainement résoudre mon problème. MAIS, y a-t-il un moyen pour que la colonne employees_count dans la table department soit AUTOMATIQUEMENT en fonction du nombre d'employés qui y travaillent au lieu de simplement être un champ entier? Existe-t-il un moyen plus pratique de résoudre ce problème, au lieu de simplement ajouter la commande UPDATE après chaque suppression effectuée?

Répondre

2

Je dirais que vous n'avez pas besoin de stocker le nombre de départements dans la table en tant qu'attribut distinct; c'est une valeur que vous pouvez toujours découvrir grâce à une requête.

En outre, la suppression d'enregistrements peut être très absolue. Ce n'est en aucun cas la meilleure pratique, mais je préfère marquer les enregistrements comme supprimés (peut-être avec un horodatage). Ce sont des informations, méta données je suppose, qui pourraient être intéressantes. De cette manière, toutes les informations sur les employés sont conservées. Nourriture pour la pensée.

J'espère que cela a été utile.