Как устранить ошибку 1442 : Не удается обновить таблицу «tb_name» в сохраненной функции/триггере в mysql?

#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 
 

И я решил разделить переменную на две части.

Это не кажется фундаментальным решением, но это был лучший способ его реализации.