如何在插入值到另一个 table 的属性的基础上增加一个 table 的属性值?
How can I increase the value of an attribute of one table on the basis of the insertion of value to an attribute of another table?
我有两个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名员工有人力资源部。所以,我想通过触发器获得 total_employees of departments table 2 的值。如果我能得到你的一些建议就太好了。
在插入触发器中没有 "old"...因为您要插入一行,而不是更新一行。该行没有以前的版本,因为它以前从未存在过。您可以只使用 new
在新创建的行中使用 department_id。而且你不需要 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 ;
另见 How to get inserted value for trigger
P.S。通过使用实际行的计数而不是简单的增量来更新它可能更安全。我担心如果几乎同时更改了很多行,它可能会歪斜。可能值得测试这是否会导致问题。
P.P.S。我假设您还计划为同一目的添加 UPDATE 和 DELETE 触发器,如果您还没有的话。
您似乎需要 update 触发器,而不是 insert 触发器。 insert 触发器将是:
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 ;
我有两个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名员工有人力资源部。所以,我想通过触发器获得 total_employees of departments table 2 的值。如果我能得到你的一些建议就太好了。
在插入触发器中没有 "old"...因为您要插入一行,而不是更新一行。该行没有以前的版本,因为它以前从未存在过。您可以只使用 new
在新创建的行中使用 department_id。而且你不需要 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 ;
另见 How to get inserted value for trigger
P.S。通过使用实际行的计数而不是简单的增量来更新它可能更安全。我担心如果几乎同时更改了很多行,它可能会歪斜。可能值得测试这是否会导致问题。
P.P.S。我假设您还计划为同一目的添加 UPDATE 和 DELETE 触发器,如果您还没有的话。
您似乎需要 update 触发器,而不是 insert 触发器。 insert 触发器将是:
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 ;