2012-04-25 74 views
0

我想要做这样的事情写使用其他表的属性更新表的查询:使用条款

CREATE TRIGGER addwinner AFTER INSERT ON bids 
FOR EACH ROW BEGIN 
IF exists(select * from wins as LT where LT.item_index=NEW.item_index) THEN 

SELECT item_index, MIN(bid_amount) 
FROM update_winnerslist AS a1 
WHERE a1.item_index = NEW.item_index; 
UPDATE wins SET email_id=NEW.emai_id, bid_amount=a1.bid_amount where wins.item_index=a1.item_index; 

END IF; 
END; 

基本上我想要的是通过比较某些属性使用另一个表的元组更新表。

+0

什么是你的问题? – eggyal 2012-04-25 21:41:50

+0

如何使用不同的表的属性更新表的基础上clause..i某些属性都试过以上,但IR不工作 – woofy 2012-04-25 21:46:17

+0

以何种方式它不工作的查询?你有错误吗?如果是这样,他们是什么?你没有得到你预期的结果吗?如果是这样,你期望什么,你看到了什么?如果你更明确,它会有所帮助。 – eggyal 2012-04-25 21:47:49

回答

0

如所解释的in the manual,限定步骤/触发器/等时。在其主体内使用;来分隔命令,则需要定义一个备用分隔符,以便将CREATE命令解释为单个语句。

UPDATESELECT的结果,像你描述的,你可以做任何的:

  1. 保存SELECT的一个变量,你再在UPDATE使用结果:

    DELIMITER ;; -- or anything else you like 
    
    CREATE TRIGGER addwinner AFTER INSERT ON bids FOR EACH ROW 
        IF EXISTS (SELECT * FROM wins AS LT WHERE LT.item_index=NEW.item_index) 
        THEN 
        SELECT MIN(bid_amount) INTO @bid_amount 
        FROM update_winnerslist AS a1 
        WHERE a1.item_index = NEW.item_index; 
    
        UPDATE wins 
        SET email_id=NEW.emai_id, [email protected]_amount 
        WHERE wins.item_index=a1.item_index; 
        END IF;; -- whatever command delimiter you chose above goes here 
    
    DELIMITER ; -- reset to normal 
    
  2. 只要使用子查询(只要它没有引用要更新的表):

    DELIMITER ;; -- or anything else you like 
    
    CREATE TRIGGER addwinner AFTER INSERT ON bids FOR EACH ROW 
        IF EXISTS (SELECT * FROM wins AS LT WHERE LT.item_index=NEW.item_index) 
        THEN 
        UPDATE wins 
        SET wins.email_id=NEW.emai_id, wins.bid_amount=(
         SELECT MIN(bid_amount) 
         FROM update_winnerslist AS a1 
         WHERE a1.item_index = NEW.item_index 
        ) 
        WHERE item_index = NEW.item_index 
        END IF;; -- whatever command delimiter you chose above goes here 
    
    DELIMITER ; -- reset to normal 
    
  3. 还是刚刚加入的表:

    DELIMITER ;; -- or anything else you like 
    
    CREATE TRIGGER addwinner AFTER INSERT ON bids FOR EACH ROW 
        IF EXISTS (SELECT * FROM wins AS LT WHERE LT.item_index=NEW.item_index) 
        THEN 
        UPDATE wins JOIN update_winnerslist AS a1 USING (item_index) 
        SET wins.email_id=NEW.emai_id, wins.bid_amount=MIN(a1.bid_amount); 
        WHERE item_index = NEW.item_index 
        END IF;; -- whatever command delimiter you chose above goes here 
    
    DELIMITER ; -- reset to normal 
    
+0

附近使用正确的语法,但我不希望我的触发器返回任何内容..我实际上不想单独使用这两个命令。我想实际选择特定的元组(如A1)从我update_winnerlist视图(SELECT语句返回一个元组),然后使用这个元组更新** **赢得根据一定的条款表(即其中wins.item_index = a1.item_index) – woofy 2012-04-25 22:01:30

+0

@woofy:啊,我现在明白了。看到我更新的答案。 – eggyal 2012-04-25 22:16:07

+0

非常感谢..很有效 – woofy 2012-04-25 22:20:45