Я новичок в триггерах, но закодировал этот
DELIMITER $$
CREATE TRIGGER stockupdate
AFTER INSERT ON inventory.orderdetails
FOR EACH ROW
BEGIN
UPDATE inventory.stockitem s
INNER JOIN inventory.OrderDetails d ON s.ID = d.Item
INNER JOIN inventory.orders o ON ebayOrderNumber = d.OrderNumber
SET s.'Sold Date' = o.'Order Date', s.EbayOrderNumber = o.ebayOrderNumber, s.'Sale Price' = d.Price
WHERE s.ID = d.Item;
END$$
DELIMITER ;
В настоящее время он не обновляет таблицу акций, как ожидалось. Есть ли что-то очевидное, что я сделал неправильно, пожалуйста?
Большое спасибо за то, что посмотрели.
Это потому, что ваше соединение возвращает все или большинство записей из таблицы oderDetails и других, и вы не sql_safe_updates
функцию безопасности sql_safe_updates
.
У вас явно отсутствует псевдоним таблицы в o ON??.ebayOrderNumber = d.OrderNumber
. Кроме того, WHERE s.ID = d.Item;
является избыточным, поскольку ваши таблицы присоединяются уже к этому. Условие Where должно быть более явным и указать, какой элемент запаса обновить.
DELIMITER $$
CREATE TRIGGER stockupdate AFTER INSERT ON inventory.orderdetails FOR EACH ROW
BEGIN
UPDATE
(inventory.stockitem s
INNER JOIN inventory.OrderDetails d ON s.ID = d.Item)
INNER JOIN inventory.orders o ON o.ebayOrderNumber = d.OrderNumber
SET
s.'Sold Date' = o.'Order Date', -- update the stock
s.EbayOrderNumber = o.ebayOrderNumber,
s.'Sale Price' = d.Price
WHERE
d.orederNumber = NEW.OrderNumber, -- From this order
d.Item = NEW.item; -- and this item id
END$$
DELIMITER ;
Сказав это, я не понимаю, почему вы хотите обновить таблицу акций проданной ценой? orderDetails
уже содержит эти данные для вас, и что, если у вас много количества для одного запаса? т.е. 100 ноутбуков Dell. У вас нет 100 записей для каждого ноутбука Dell в вашем складе? и обновление каждой записи с продажной ценой? В любом случае я оставлю это до вас.
s.ID = NEW.Item