如何从两个表中删除

xurqigkl  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(375)

我有两个表employees和salary,我准备查询的方式是,一旦从employees表中删除了staff,salary表中的staff salary就会自动删除。
从职员表中删除职员记录后,如何从薪资表中删除职员记录?
以下是我的sql代码:

$db->query('
 DELETE employees
      , salary 
   FROM employees 
 JOIN salary
  WHERE employees.id = salary.staffId 
    AND salary.staffId = :id'
 );
o4hqfura

o4hqfura1#

您必须离开join并更改where子句

$db->query('
 DELETE employees
      , salary 
   FROM employees 
 LEFT JOIN salary ON employees.id = salary.staffId 
  WHERE employees.id = :id'
 );
CREATE TABLE employees(id INT)
INSERT INTO employees VALUES(1),(2),(3),(4)
CREATE TABLE salary (id INT,staffId INT)
INSERT INTO salary  VALUES(1,1),(2,2),(3,3)
DELETE employees
      , salary 
   FROM employees LEFT JOIN salary ON employees.id = salary.staffId 
  WHERE employees.id = 4
SELECT * FROM employees
| id |
| -: |
|  1 |
|  2 |
|  3 |

db<>在这里摆弄

idfiyjo8

idfiyjo82#

已经解释了如何 delete 使用 left join .
我这样回答是因为我认为您错过了使用数据库引擎内置功能的机会。以下是您对上下文的描述:
我准备查询的方式是,一旦从employees表中删除了staff,salary表中的staff薪资就会自动删除。
您正在描述雇员和工资之间的父子关系:我建议您在表中创建一个外键约束 salary ,它引用了表 employee . 您可以设置选项 on delete cascade 因此,当父记录被删除时,所有相应的子记录也会自动删除(如果没有子记录,则子表不受影响)。
可以将外键约束添加到现有表中,如下所示:

alter table salary 
    add constraint fk_staff_id
    foreign key (staff_id)
    references employee(id)
    on delete cascade;

然后,要删除员工,您只需执行以下操作。。。

delete from employee where id = :id;

... 请放心,任何相关的记录 salary 将自动删除。

相关问题