3
顧客 (cid、cname、caddress、ccity、cstate、czip、ccardnum)
製品 (pid、pname、pbrand、pprice)
ShoppingCart(cartid、cid、active、totalprice)          
ShoppingCart.cid が Customer.cid を参照
CartItem(cartid、pid、iprice、iquantity)     
CartItem.cartid は ShoppingCart.cartid を参照し、
CartId.pid は Product.pid を参照します
Order(oid, carid, time, payprice) Order.cartid は ShoppingCart.cartid への参照

特定の製品の価格が変更されたときに、そのアイテムを含むアクティブなショッピング カート内のこのアイテムの価格を更新し、これらのショッピング カートの合計価格も更新するトリガーを作成しますか?.

CREATE TRIGGER priceupdate AFTER UPDATE ON product
FOR EACH ROW
BEGIN
UPDATE cartitem 
SET iprice=new.pprice 
WHERE pid=new.pid 
and cartid in 
(select cartid                                           
from shoppingcart WHERE active='1');

UPDATE shoppingcart 
SET totalprice = 
(select sum(iprice*iquantity) 
from cartitem WHERE cartid=new.cartid;
END;

上記のコードは、caritem の更新に使用されるショッピング カートを更新しているため、エラーが発生しました。
以下のコードを試してみると、問題なく動作しましたが、shoppingcart の合計価格を更新できません。誰かがショッピング カートの totalprice の更新を手伝ってくれます

CREATE TRIGGER priceupdate AFTER UPDATE ON product
FOR EACH ROW
BEGIN
UPDATE cartitem 
SET iprice=new.pprice 
WHERE pid=new.pid and cartid in 
(select cartid                                           
from shoppingcart WHERE active='1');
END;

注:MYSQLを使用しています

サンプル データ: http://www.sqlfiddle.com/#!2/8489e9/4/3

4

1 に答える 1

1

試す

DELIMITER $$
CREATE TRIGGER product_priceupdate 
AFTER UPDATE ON product
FOR EACH ROW
BEGIN
  UPDATE cartitem i JOIN shoppingcart c
      ON i.cartid = c.cartid
     SET i.iprice = NEW.pprice 
   WHERE i.pid = NEW.pid 
     AND c.active  = 1;

  UPDATE shoppingcart c JOIN
 (
   SELECT cartid, SUM(iprice * iquantity) totalprice
     FROM cartitem 
    WHERE cartid IN
          (
            SELECT DISTINCT i.cartid 
              FROM cartitem i JOIN shoppingcart c
                ON i.cartid = c.cartid
             WHERE i.pid = NEW.pid 
               AND c.active  = 1
          )
    GROUP BY cartid
 ) q
     ON c.cartid = q.cartid
    SET c.totalprice = q.totalprice;
END$$
DELIMITER ;

これがSQLFiddleのデモです

于 2013-11-11T04:56:30.913 に答える