#mysql #sql #triggers
Вопрос:
delimiter $
create trigger payment_mile_trigger
after insert on PAYMENT
for each row
begin
if @mileuse = 'all' then
update customer
set cust_usedmile = cust_usedmile cust_currentmile
and cust_currentmile = 0
where customer.cust_id = new.cust_id;
elseif @mileuse > 0 then
update customer
set cust_usedmile = cust_currentmile @mileuse
and cust_currentmile = cust_currentmile - @mileuse
where customer.cust_id = new.cust_id;
end if ;
end $
delimiter ;
delimiter $
create trigger Booking_trigger3
before insert on Booking
for each row
begin
declare pay_totalamount int;
declare time_stamp timestamp;
declare pay_type varchar(15);
declare key_id int;
declare cust_id int;
set pay_totalamount = new.booking_totalamount;
set time_stamp = current_timestamp();
set pay_type = @paytype;
set key_id = null;
set cust_id = new.cust_id;
if @mileuse = 'all' then
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value ((select cust_currentmile from customer where customer.cust_id=cust_id),
time_stamp, 'mile',key_id,cust_id);
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value (pay_totalamount-(select cust_currentmile from customer where cust_id=cust_id),
time_stamp, pay_type,key_id,cust_id);
elseif @mileuse > 0 then
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value (@mileuse,
time_stamp, 'mile',key_id,cust_id);
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value (pay_totalamount-@mileuse,
time_stamp, pay_type,key_id,cust_id);
else
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value (pay_totalamount,time_stamp, pay_type,key_id,cust_id);
end if;
end $
delimiter ;
Я создал два триггера.
Один из них-это триггер, который вставляет две данные в таблицу платежей, если вы оплачиваете пробег при бронировании. (Оплата пробега, оставшаяся сумма оплачивается другими способами оплаты)
И другой триггер-вычесть пробег. Если в таблице платежей есть товар, оплаченный пробегом, мили вычитаются из таблицы клиентов.
Но я получаю ошибку:
Код ошибки: 1442. Не удается обновить таблицу «клиент» в сохраненной функции/триггере, потому что она уже используется оператором, который вызвал эту сохраненную функцию/триггер.
Я предполагаю, что эта проблема связана с конфликтом двух вышеперечисленных триггеров. Это связано с тем, что один выбирает данные(пробег) из таблицы клиентов, когда используется весь пробег, а другой обновляет данные(пробег) из таблицы клиентов.
Я обнаружил две проблемы. Во-первых, пробег не вычитается из таблицы клиентов.
Вторая проблема заключается в том , что, когда я устанавливаю @mileuse = «все», я получаю ту же ошибку, что и заголовок.
Как я могу решить эту проблему?
Комментарии:
1. Я отредактировал содержимое, чтобы подробнее рассказать о проблеме, которую я обнаружил.
Ответ №1:
Я решил эту проблему немного по-другому.
delimiter $
create trigger Booking_trigger3
before insert on Booking
for each row
begin
declare pay_totalamount int;
declare time_stamp timestamp;
declare pay_type varchar(15);
declare key_id int;
declare cust_id int;
set pay_totalamount = new.booking_totalamount;
set time_stamp = current_timestamp();
set pay_type = @paytype;
set key_id = null;
set cust_id = new.cust_id;
if @mileuse > 0 then
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value (@mileuse,
time_stamp, 'mile',key_id,cust_id);
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value (pay_totalamount-@mileuse,
time_stamp, pay_type,key_id,cust_id);
else
insert into payment(pay_totalamount,pay_date,pay_type,key_id,cust_id)
value (pay_totalamount,time_stamp, pay_type,key_id,cust_id);
end if;
end $
delimiter ;
Я удалил » если @mileuse = все, то …»
select @mileuse := '0';
select @mileuse :=
(select cust_currentmile from customer
where cust_id = @custid); # all mile pay
И я решил разделить переменную на две части.
Это не кажется фундаментальным решением, но это был лучший способ его реализации.