Пара вещей:
"после вставки" и "если (вставка)" являются избыточными. Удалите «Если (вставка)» это не нужно, так как ваш триггер ограничен ПОСЛЕ ВСТАВКИ. Просто добавляет больше кода для чтения.
Кажется, вы пытаетесь уменьшить свой инвентарь, когда что-то продается. Я не вижу, что вы на самом деле это делаете.
Этот встроенный запрос не имеет ключа, связанного с ним. (Это ваше сообщение об ошибке).
select i.quantity
from inventory i, concessions_sold cs, concession c
where i.inventory_id = c.inventory_id and c.concession_id = cs.concession_id
- У вас нет предложения where, и ваш inline-select не ограничивает строки, возвращающиеся из таблицы инвентаря. Если вы добьетесь того, чтобы это сработало, вы будете обновлять каждую строку в своей таблице инвентаризации.
Чтобы ваше действительное предложение об обновлении работало.
UPDATE (
SELECT **i.inventory_id**, i.quantity
FROM Inventory i
, Concessions_sold cs
, Concessions c
WHERE i.inventory_id = c.inventory_id
AND c.concession_id = **:NEW.concession_id**
)
SET quantity = :new.quantity
Теперь все работает, есть несколько проблем:
1. Связывание таблицы не требуется.
2. Встроенный SQL делает этот оператор UPDATE более трудным для чтения и, следовательно, более трудным для изменения в будущем.
Я был бы намного более явным:
UPDATE Inventory
SET quatity = quanaity - :new.quanity
WHERE inventory_id IN (
SELECT inventory_id
FROM Conessions c
JOIN c.concession_id = :NEW.concession_id
)
Очевидно, что нет никаких проверок, чтобы увидеть, что количество инвентаря действительно существует, что-то еще, что вы могли бы принять во внимание.
Итак, ваш новый триггер будет выглядеть так.
CREATE or REPLACE TRIGGER LabEx5_1 AFTER INSERT ON Concessions_sold
FOR EACH ROW
BEGIN
UPDATE Inventory
SET quatity = quanaity - :NEW.quanity
WHERE inventory_id IN (
SELECT inventory_id
FROM Conessions c
JOIN c.concession_id = :NEW.concession_id
);
END LabEx5_1;