如何在向另一个表的属性插入值的基础上增加一个表的属性的值?

t0ybt7op  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(302)

我有两张table。

CREATE TABLE `departments` (
department_id INT(2) NOT NULL AUTO_INCREMENT,
department_name VARCHAR(30) NOT NULL,
total_employees INT(4),
PRIMARY KEY (department_id),
UNIQUE (department_name));

CREATE TABLE `employees` (
employee_id INT(4) NOT NULL AUTO_INCREMENT,
employee_email VARCHAR(30) NOT NULL,
employee_first_name VARCHAR(30) NOT NULL,
employee_last_name VARCHAR(30) NOT NULL,
department_name VARCHAR(30) NOT NULL,
PRIMARY KEY (employee_id),
UNIQUE (employee_email),
FOREIGN KEY (department_name)
    REFERENCES departments (department_name)
    ON DELETE CASCADE);

现在,假设我有一个部门是人力资源管理。2名员工设有人力资源部。所以,我想通过一个触发器得到表2部门的员工总数。如果我能得到你的一些建议就太好了。

yeotifhr

yeotifhr1#

你似乎想要一个更新触发器,而不是插入触发器。插入触发器将是:

delimiter $$ 

create trigger employee_insertion_in_individual_department
after insert on employees for each row
begin
    update departments set 
        total_employees = total_employees + 1 
        where department_id = new.department_id;
    end if;
end$$

delimiter ;

更新触发器更像:

delimiter $$ 
create trigger employee_insertion_in_individual_department
after insert on employees for each row
begin
    if not (old.employee_department <=> old.employee_department) then
        update departments set 
            total_employees = total_employees + (case when department_id = old_department_id then -1 else 1 end)
            where department_id in (old.department_id, new.department_id);
    end if;
end$$

delimiter ;
ne5o7dgx

ne5o7dgx2#

在insert触发器中没有“old”…因为您正在插入一行,而不是更新一行。该行没有以前的版本,因为它以前从未存在过。您只需使用新创建的行中的department\u id new 相反。你不需要 if 因为没有什么可比的:

delimiter $$ 
create trigger employee_insertion_in_individual_department
  after insert on employees for each row begin

    update departments set total_employees=total_employees+1 
    where department_id=new.department_id; 

end$$ delimiter ;

另请参见如何获取触发器的插入值
p、 通过使用实际行的计数而不是简单的增量来更新它可能更安全。我担心如果在几乎同一时间更改了许多行,它可能会倾斜。这是否会导致问题,可能值得检验。
p、 另外,我假设您也计划为相同的目的添加更新和删除触发器,如果您还没有这样做的话。

相关问题