MySQL - 一个表上的行删除不会更新另一表的关系
Posted
技术标签:
【中文标题】MySQL - 一个表上的行删除不会更新另一表的关系【英文标题】:MySQL - Row Deletion on one table does not update relationship at other table 【发布时间】:2018-02-10 12:54:29 【问题描述】:我有两张桌子,一张给员工,一张给部门。一个部门可以有多名/不同的员工,但一名员工只能在一个部门工作。他们的关系是一对多的。
表格创建:
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','vagg7@gmail.com','1995','Greece','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('James','Gunn','james8@gmail.com','1970','USA','Athens');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('George','McMahon','george95@gmail.com','1978','Usa','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('John','Jones','john13@gmail.com','1992','England','Patras');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Marinos','Kuriakopoulos','marin_kur@gmail.com','1986','Greece','Alexandroupoli');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Dimitris','Nikolaou','dimitis8@yahoo.gr','1984','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Soufiane','El Kaddouri','sofiane@yahoo.com','1974','France','Xanthi');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Maria','Apostolou','mariamaria1@gmail.com','1997','Greece','Larisa');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Ioannis','Marinou','ioannis_ap@yahoo.gr','1982','Greece','Kalamata');
INSERT INTO employee(first_name,last_name,email,born,country,department_name) VALUES('Thanasis','Athanasiou','thanos89@gmail.com','1989','Cyprus','Heraklion');
UPDATE department SET employees_count = (SELECT COUNT(*) FROM employee WHERE department.name = employee.department_name);
在创建 2 个表并在它们之间创建外键约束后,当我从部门表中删除一个部门时,每个关联的员工也会根据我的需要被删除。
但是,当我从员工表中删除员工时,部门中的 employees_count 行没有改变。例如,如果我有 2 名员工的部门名称 = 雅典,那么在删除其中一名员工后,当我转到部门表时,员工人数仍然等于 2 而不是 1。
更新员工表中的部门名称时也会发生同样的事情。如果对于一位员工,我将他的部门名称从“Athens”更新为“Patras”,则部门表保持不变。
所以我在想,在我删除一个员工之后,也许也执行这个命令
UPDATE department SET employees_count = (SELECT COUNT(*) FROM employee WHERE department.name = employee.department_name);
这肯定会解决我的问题。
但是,有没有办法将部门表中的 employees_count 列自动分配给在那里工作的员工人数,而不仅仅是一个整数字段? 有没有更实用的方法来解决这个问题,而不是在我每次删除后添加 UPDATE 命令?
【问题讨论】:
【参考方案1】:我想说您不需要将部门计数作为单独的属性存储在表中;这是一个您可以通过查询随时找到的值。
此外,删除记录可能非常绝对。这绝不是最佳实践,但我更喜欢将记录标记为已删除(可能带有时间戳)。这是信息,我猜是元数据,可能会引起人们的兴趣。这样,所有员工信息都被保留了下来。值得深思。
希望对您有所帮助。
【讨论】:
以上是关于MySQL - 一个表上的行删除不会更新另一表的关系的主要内容,如果未能解决你的问题,请参考以下文章