私は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);
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コマンドを追加するのではなく、この問題を解決するためのより現実的な方法はありますか?