当前位置: 首页 > 知识库问答 >
问题:

MySQL-删除一个表上的行不会更新其他表上的关系

邵浩大
2023-03-14

我有两张桌子,一张是给员工的,另一张是给部门的。一个部门可以有多个/不同的员工,但一个员工只能在一个部门工作。他们的关系是一对多。

表创建:

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);

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

共有1个答案

阎懿轩
2023-03-14

我会说,您不需要将部门计数作为一个单独的属性存储在表中;它是一个可以通过查询找到的值。

此外,删除记录可能是非常绝对的。这绝不是最佳实践,但我更喜欢将记录标记为已删除(可能带有时间戳)。这是信息,我猜是元数据,可能会引起兴趣。这样,所有的员工信息都被保留了下来。发人深省。

希望这能有所帮助。

 类似资料:
  • 您好,我有两个表,其中表1是针对产品的,表2是我想使用this SQL更新的类别,但不断出现语法错误 1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,在第4行的“WHERE EXISTS(SELECTproduct.local_delivery,product.none”附近使用正确的语法

  • 数据表之间经常存在外键关联的情况,这时如果直接删除父表,会破坏数据表的完整性,也会删除失败。 删除父表有以下两种方法: 先删除与它关联的子表,再删除父表;但是这样会同时删除两个表中的数据。 将关联表的外键约束取消,再删除父表;适用于需要保留子表的数据,只删除父表的情况。 下面介绍了如何取消关联表的外键约束并删除主表,也就是上面所说的删除父表的第二种方法。   在数据库中创建两个关联表。创建表 tb

  • 是否可以基于2个值删除其他图纸上的行?假设我有3张床单。在主工作表(工作表1)中,将有两列:分支和管理器,与其余工作表相同。 这里是电子表格样本。 示例数据: 第1页:(主页) 表2: 表2: 应该做的是: 分支列值不应在所有工作表中重复。因此,我们需要做的是删除工作表2和3上的行,如果分支列与主工作表(表1)相等IF AND ONLY IF如果管理器不相同/相等。因此,在我上面给出的数据中,加州

  • 问题内容: 我正在尝试根据另一个MySQL信息更新一个MySQL表。 我的桌子看起来像: 而表如下所示: 我想更新在与来自基于(存储在字符串字段)。 希望更新后的表如下所示: 我有一个有效的查询,但是非常慢: 这使我的CPU耗尽,最终导致超时,并且仅执行了一部分更新(有数千个要匹配的值)。我知道匹配的速度会很慢,但这是我必须将它们匹配在一起的唯一数据。 有没有更好的方法来更新这样的值?如果可以更快

  • 我有3个表:,,。用户和池具有透视表,因为它们具有多对多关系。 权限条目仅由我手动创建。然后,每个池可以根据自己的用户认为合适的情况将权限分配给他们自己的用户。因此,用于将用户链接到权限的透视表需要同时具有和和 那么这个数据透视表是如何工作的呢?如何制作三向透视表? 编辑:我的问题基本上是在这里问的,没有令人满意的答案!

  • 本文向大家介绍MySQL命令行删除表中的一个字段,包括了MySQL命令行删除表中的一个字段的使用技巧和注意事项,需要的朋友参考一下 先看看删除之前的表结构: mysql> select * from test; +------+--------+----------------------------------+------------+------------+------------+---