#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 ;