Как сделать триггеры для удаления и добавления с оператором if MySQL? - PullRequest
0 голосов
/ 03 мая 2020

имеют две таблицы Очередь (назначение / фактическое время) Queue_Summary (дата, doctor_id, num_of_patients)

Первая - это все очереди, а вторая - сколько очередей для каждого врача на определенную дату. Мне нужно создать триггер, который обновляет num_of_patients, каждый раз, когда в очереди добавляется очередь, мне нужно добавить к врачу num_of_patients в эту дату. Также при удалении.

Я только что посчитал количество очередей с данными doctor_id и date, разделил его на два триггера. Но единственная проблема, с которой я сталкиваюсь, - это где я размещаю оператор if, который проверяет, находится ли эта дата в Queue_Summary, а если нет, добавляет ее.

(PS - я не 100% на те, так как моя база данных немного выключен и делает кучу проблем, если есть какие-то проблемы в этих отчетах, я буду рад их узнать)

delimiter //
 CREATE TRIGGER update_queue_summary 
    AFTER DELETE ON queue
    FOR EACH ROW
        BEGIN
            update queue_summary as qs set num_of_patient = ( 
                select count(appointment_id) 
                from queue as q join appointment as a on appointment_id
                where a.doctor_id=qs.doctor_id and date(qs.actual_time)=date(qs.date())
                group by appointment_id
                ) where doctor_id=qs.doctor_id and date(qs.actual_time)=date(qs.date());
       END;//
 delimiter ;
delimiter //
 CREATE TRIGGER update_queue_summary 
    AFTER insert ON queue
    FOR EACH ROW
        BEGIN
            update queue_summary as qs set num_of_patient = ( 
                select count(appointment_id) 
                from queue as q join appointment as a on appointment_id
                where a.doctor_id=qs.doctor_id and date(qs.actual_time)=date(qs.date())
                group by appointment_id
                ) where doctor_id=qs.doctor_id and date(qs.actual_time)=date(qs.date());
       END;//
 delimiter ;

1 Ответ

1 голос
/ 03 мая 2020

Вы должны провести тест на существование в вашем триггере. Например,

drop table if exists queue,queue_summary;
create table queue  (appointment_id int auto_increment primary key, doctor_id int,actual_time datetime);
create table Queue_Summary (date date, doctor_id int, num_of_patients int);

delimiter $$
create trigger ut after insert on queue
for each row 
begin
    if not exists (select 1 from queue_summary where date = date(new.actual_time) and doctor_id = new.doctor_id)  then
        insert into queue_summary values(date(new.actual_time),new.doctor_id,1);
    else
        update queue_summary
            set num_of_patients = num_of_patients + 1
            where date = date(new.actual_time) and doctor_id = new.doctor_id;
    end if;
end $$

delimiter ;

insert into queue (doctor_id,actual_time) values(1,'2020-05-03 09:00'),(1,'2020-05-03 09:30');

select * from queue;
select * from queue_summary;

MariaDB [sandbox]> select * from queue;
+----------------+-----------+---------------------+
| appointment_id | doctor_id | actual_time         |
+----------------+-----------+---------------------+
|              1 |         1 | 2020-05-03 09:00:00 |
|              2 |         1 | 2020-05-03 09:30:00 |
+----------------+-----------+---------------------+
2 rows in set (0.001 sec)

MariaDB [sandbox]> select * from queue_summary;
+------------+-----------+-----------------+
| date       | doctor_id | num_of_patients |
+------------+-----------+-----------------+
| 2020-05-03 |         1 |               2 |
+------------+-----------+-----------------+
1 row in set (0.001 sec)

И триггер удаления аналогичен, но проще

delimiter $$
create trigger dt after delete on queue
for each row 
begin
    if exists (select 1 from queue_summary where date = date(OLD.actual_time) and doctor_id = old.doctor_id)  then
        update queue_summary
            set num_of_patients = num_of_patients - 1
            where date = date(old.actual_time) and doctor_id = old.doctor_id;
    end if;

end $$

delimiter ;

Проверка существования полностью косметическая c, так как удаление не будет жаловаться, если удалить нечего .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...