Как мне изменить мой триггер, чтобы я мог получать total_employees в соответствии с их отделами? - PullRequest
0 голосов
/ 29 ноября 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);

это триггер, я хочу, чтобы он отображал общую сумму сотрудников в каждом отделе.

delimiter $$
create trigger department_wise_total_employee_counting
after insert on employees 
for each row begin update departments set total_employees=total_employees+1
where department_id=department_id; end$$ delimiter ;

INSERT INTO `departments` 
VALUES 
(1,'HRM',0),(2,'Accounting',0);
INSERT INTO `employees` 
VALUES 
(1,'bh@gmail.com','A','B','HRM'),
(2,'ak@gmail.com','C','D','HRM'),
(3,'mr@gmail.com','E','F','HRM'), 
(4,'pr@gmail.com','G','H','Accounting');

При запуске следующегоquery:

select * from departments;

Я получаю этот вывод, который просто дает общее количество сотрудников, а не общее количество для каждого отдела.enter image description here

Я пытаюсь получить total_employees = 3 для HRM и total_employees = 1 для учета.Буду признателен за любые предложения.

1 Ответ

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

Как указывал @ P.Salmon, в общем, вы не должны хранить данные, которые вы можете легко вычислить.Для этого приложения хорошим решением будет VIEW (как предложено @TamilSelvanC).Например:

CREATE VIEW departments_view AS
SELECT d.department_id, d.department_name, COUNT(e.employee_id) AS total_employees
FROM departments d
LEFT JOIN employees e ON e.department_name = d.department_name
GROUP BY d.department_id;
SELECT * FROM departments_view

Вывод:

department_id   department_name     total_employees
1               HRM                 3
2               Accounting          1
3               Engineering         0

Демонстрация на dbfiddle

...