Как я могу увеличить значение атрибута одной таблицы на основе вставки значения в атрибут другой таблицы? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть две таблицы.

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

Теперь предположим, что у меня есть отдел, который является HRM.2 сотрудника имеют отдел кадров.Итак, я хочу, чтобы значение total_employees отделов таблицы 2 через триггер.Было бы здорово, если бы я мог получить некоторые ваши предложения.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы, кажется, хотите триггер 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 ;

Триггер update будет выглядеть так:

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 ;
0 голосов
/ 28 ноября 2018

В триггере вставки нет "старого" ... потому что вы вставляете строку, а не обновляете ее.Предыдущей версии строки не существует, потому что ее никогда не было.Вы можете просто использовать Department_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 ;

См. Также Как получить вставленное значение для триггера

PS Это можетбыло бы безопаснее обновить это, используя количество фактических строк, а не простое приращение.Я волнуюсь, что это может измениться, если множество строк будет изменено почти одновременно.Возможно, стоит проверить, вызывает ли это проблемы или нет.

PPS Я предполагаю, что вы также планируете добавить триггеры UPDATE и DELETE для той же цели, если вы этого еще не сделали.

...