ТРИГГЕР для УВЕЛИЧЕНИЯ после ВСТАВКИ

#mysql #triggers #sql-update #sql-insert

#mysql #триггеры #sql-обновление #sql-вставка

Вопрос:

Я пытаюсь создать триггер, который увеличивает количество карт в таблице фракций после ВСТАВКИ в card, если строка faction.factionname совпадает cards.faction со ВСТАВКОЙ.

до сих пор я пробовал несколько разных методов, но приведенный ниже код является моим ближайшим предположением

 create table cards(
    cardid int not null,
    faction varchar(255) not null,
    primary key(cardid)
);

create table faction(
    factionname varchar(255) not null,
    cardcount int not null,
    primary key(factionname)
);


create trigger updatecountinsert
    after insert on cards
    for each row
begin
    update faction
    set cardcount=carcount 1
    where last_insert_id().faction=faction.factionname
end; 
  

В принципе, если я вставляю значения (11, ‘x’), x является фракцией, если строка фракции имеет factionname = x
триггер должен
увеличьте «cardcount» этой строки на 1

Комментарии:

1. Что не работает при таком подходе? В чем ваш актуальный вопрос? Пожалуйста, будьте конкретны

2. «где last_insert_id().faction=фракция. в строке «factionname » утверждается, что имеется синтаксическая ошибка. Я пытаюсь заставить триггер в конце кода работать. также спасибо за редактирование

3. У вас действительно есть то, что кажется carcount вместо cardcount — помогает ли это исправление?

4. о, моя ошибка. Я исправил это, но я все еще получаю ту же ошибку.

5. Обычно вы используете OLD и NEW в триггерах; не last_insertid() . … и даже если бы last_insert_id() был необходим, он не возвращает строку, которую вы могли бы использовать для ссылки на подобные поля , и полагается на автоматически увеличиваемый идентификатор, которого не хватает вашим таблицам.

Ответ №1:

 DELIMITER $$

CREATE TRIGGER updatecountinsert
AFTER INSERT ON cards
FOR EACH ROW
BEGIN
   -- NEW is used to qualify references values of the row that was just inserted
   -- e.g. NEW.faction is a reference to the value in the faction column
   UPDATE faction f
      SET f.cardcount = f.cardcount   1
    WHERE f.factionname = NEW.faction ;
END;
$$

DELIMITER ;