MYSQL 根据其他列触发具有相同列的更新列
MYSQL Trigger Update column with same column based on other column
我有以下 table.
order_id code value
1 sub_total 5.00
1 shipping 5.00
1 total 10.00
2 sub_total 3.00
2 shipping 6.00
2 total 9.00
有时 sub_total 需要更新(例如添加产品),总数也需要更新。我创建了一个触发器来更新 sub_total。我还要如何根据 sub_total 和运费更新总数?
我尝试了以下操作:
CREATE TRIGGER after_order_product_update AFTER UPDATE ON order_product FOR EACH ROW
BEGIN
UPDATE `order_total`
SET `value` = NEW.`total` WHERE `order_id` = NEW.`order_id` AND `code` = 'sub_total';
UPDATE `order_total`
SET `value` = (SELECT `value` FROM `order_total` WHERE `code` = 'shipping' AND `order_id` = NEW.`order_id`) + (SELECT `value` FROM `order_total` WHERE `code` = 'sub_total' AND `order_id` = NEW.`order_id`) WHERE `code` = 'total' AND `order_id` = NEW.`order_id`;
END;
这里我收到一个"You can't specify target table 'oc_order_total' for update in FROM clause Error No: 1093"
CREATE TRIGGER after_order_product_update AFTER UPDATE ON order_product FOR EACH ROW
BEGIN
DECLARE SBvalue VARCHAR(32);
DECLARE SHIPvalue VARCHAR(32);
UPDATE `order_total` SET `value` = NEW.`total` WHERE `order_id` = NEW.`order_id` AND `code` = 'sub_total';
SET SBvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'sub_total' AND `order_id` = NEW.`order_id`);
SET SHIPvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'shipping' AND `order_id` = NEW.`order_id`);
UPDATE `oc_order_total` SET `value` = `SBvalue` + `SHIPvalue` WHERE `code` = 'total' AND `order_id` = NEW.`order_id`;
END;
这里我收到一个 "Subquery returns more than 1 row" 错误。
SET SBvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'sub_total'
AND `order_id` = NEW.`order_id` LIMIT 1);
SET SHIPvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'shipping'
AND `order_id` = NEW.`order_id` LIMIT 1);
第二次查询错误给limit 1..
希望对您有所帮助
BEGIN
UPDATE `order_total`
SET `value` = (
(SELECT `value` FROM (
SELECT `value` FROM `oc_order_total`
WHERE `code` = 'sub_total' AND `order_id` = NEW.`order_id`)
AS mySubTotalTable
WHERE `order_id` = NEW.`order_id`) +
(SELECT `value` FROM (
SELECT `value` FROM `oc_order_total`
WHERE `code` = 'shipping' AND `order_id` = NEW.`order_id`)
AS myShippingTable
WHERE `order_id` = NEW.`order_id`))
WHERE `code` = 'total' AND `order_id` = NEW.`order_id`;
END
我有以下 table.
order_id code value
1 sub_total 5.00
1 shipping 5.00
1 total 10.00
2 sub_total 3.00
2 shipping 6.00
2 total 9.00
有时 sub_total 需要更新(例如添加产品),总数也需要更新。我创建了一个触发器来更新 sub_total。我还要如何根据 sub_total 和运费更新总数?
我尝试了以下操作:
CREATE TRIGGER after_order_product_update AFTER UPDATE ON order_product FOR EACH ROW
BEGIN
UPDATE `order_total`
SET `value` = NEW.`total` WHERE `order_id` = NEW.`order_id` AND `code` = 'sub_total';
UPDATE `order_total`
SET `value` = (SELECT `value` FROM `order_total` WHERE `code` = 'shipping' AND `order_id` = NEW.`order_id`) + (SELECT `value` FROM `order_total` WHERE `code` = 'sub_total' AND `order_id` = NEW.`order_id`) WHERE `code` = 'total' AND `order_id` = NEW.`order_id`;
END;
这里我收到一个"You can't specify target table 'oc_order_total' for update in FROM clause Error No: 1093"
CREATE TRIGGER after_order_product_update AFTER UPDATE ON order_product FOR EACH ROW
BEGIN
DECLARE SBvalue VARCHAR(32);
DECLARE SHIPvalue VARCHAR(32);
UPDATE `order_total` SET `value` = NEW.`total` WHERE `order_id` = NEW.`order_id` AND `code` = 'sub_total';
SET SBvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'sub_total' AND `order_id` = NEW.`order_id`);
SET SHIPvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'shipping' AND `order_id` = NEW.`order_id`);
UPDATE `oc_order_total` SET `value` = `SBvalue` + `SHIPvalue` WHERE `code` = 'total' AND `order_id` = NEW.`order_id`;
END;
这里我收到一个 "Subquery returns more than 1 row" 错误。
SET SBvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'sub_total'
AND `order_id` = NEW.`order_id` LIMIT 1);
SET SHIPvalue = (SELECT `value` FROM `order_total` WHERE `code` = 'shipping'
AND `order_id` = NEW.`order_id` LIMIT 1);
第二次查询错误给limit 1..
希望对您有所帮助
BEGIN
UPDATE `order_total`
SET `value` = (
(SELECT `value` FROM (
SELECT `value` FROM `oc_order_total`
WHERE `code` = 'sub_total' AND `order_id` = NEW.`order_id`)
AS mySubTotalTable
WHERE `order_id` = NEW.`order_id`) +
(SELECT `value` FROM (
SELECT `value` FROM `oc_order_total`
WHERE `code` = 'shipping' AND `order_id` = NEW.`order_id`)
AS myShippingTable
WHERE `order_id` = NEW.`order_id`))
WHERE `code` = 'total' AND `order_id` = NEW.`order_id`;
END