2017-09-01 8 views
1

私は2つのテーブルを持ちます.1つは従業員用で、もう1つはDepartments用です。部署は複数の従業員を持つことができますが、1人の従業員は1つの部署でのみ働くことができます。彼らの関係は1対多です。MySQL - 1つのテーブルの行削除で他のテーブルの関係が更新されない

表創作:

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; 

表の挿入:

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

2つのテーブルを作成し、それらの間に外部キー制約を作成すると、部門テーブルから部門を削除すると、必要なときに、すべての従業員も削除されます。

ただし、従業員表から従業員を削除すると、部門のemployees_count行は変更されません。たとえば、department_name = Athensの2人の従業員がいる場合、その1つを削除するとdepartmentsテーブルに行くと、employees_countは1ではなく2になります。

department_nameを更新すると同じことが起こります。従業員テーブル。 1人の従業員の場合、彼のdepartment_nameを「Athens」から「Patras」に更新すると、部門テーブルは変更されません。

は、だから私は多分また、このコマンド

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

を実行し、それは確かに私の問題を解決するだろう、私は従業員を削除した後、考えていました。

しかし、部門テーブルのemployees_count列が自動でになる方法がありますか?整数フィールドではなく、そこで働く従業員の数に自動で割り当てられますか? 各削除後にUPDATEコマンドを追加するのではなく、この問題を解決するためのより現実的な方法はありますか?

答えて

2

別の属性としてテーブルに部門数を格納する必要はありません。それはあなたがいつもクエリを通して見つけることができる価値です。

また、レコードを削除することは非常に絶対的です。これは決してベストプラクティスではありませんが、レコードを削除済みとしてマークすることをお勧めします(おそらくタイムスタンプ付き)。これは興味深い情報であると思われるメタデータです。このようにして、すべての従業員情報が保持されます。思考の糧。

希望しました。

関連する問題