2013-07-31 82 views
0

我只是想以兩種方式存儲記錄。檢查條件時觸發器無法正常工作

  1. 如果它存在,它會更新信息
  2. 如果不到風度存在,它會插入新記錄

下面是大綱模式爲我的表:

product_purchase_item has product_purchase_item_id,product_id,數量列
product_stock已經product_stock_id,PRODUCT_ID,product_total_quantity列

我創建觸發器

DELIMITER // 
CREATE TRIGGER store_check AFTER INSERT ON product_purchase_item 
FOR EACH ROW 
BEGIN 
    DECLARE X INTEGER; 
    SET X =(SELECT product_id FROM product_stock where product_id = NEW.product_id); 
    IF NEW.product_id !=X THEN 
    INSERT INTO product_stock VALUES(NULL,NEW.product_id,NEW.quantity); 
    ELSE 
    UPDATE product_stock 
    SET product_total_quantity=product_total_quantity+NEW.quantity 
    WHERE product_id=NEW.product_id; 
    END IF; 
END;// 
DELIMITER;// 

的問題是在product_stock表中,當不存在產品記錄INSERT查詢不工作,但更新當產品記錄確實存在時,查詢工作會正確執行

回答

1

它真的是「不起作用」的INSERT語句嗎?或者,INSERT語句根本沒有被執行的問題?

當前面的SELECT查詢沒有返回行時會發生什麼?什麼值分配到X

X具有該值時,條件測試「foo != X」返回TRUE,還是返回其他值(如FALSE或NULL)?

你有沒有試過類似的東西?

IF NEW.product_ID = X THEN 
    UPDATE ... 
ELSE 
    INSERT ...  
END IF; 

(我知道這是不好的做法,回答一個問題一個問題,但它似乎apropros,因爲回答這些,會得到答案的問題你真的要問。)

+0

是的,它的工作原理。謝謝。對於php的條件是相同的規則? – Imran

+1

SQL中的布爾邏輯是三個值:TRUE,FALSE和NULL。當其中一個值爲NULL時,比較(<, <=, =, > =,>,<>,!=)將返回NULL。如果'condition'返回TRUE,'IF條件THEN'將只執行'THEN'模塊。 – spencer7593

1

你可以通過MySQL的標準命令之一做所需的操作:

INSERT INTO product_stock (product_id,product_total_quantity) 
        VALUES (NEW.product_id,NEW.quantity) 
ON DUPLICATE KEY UPDATE product_total_quantity=product_total_quantity+NEW.quantity; 

看到MySQL manual

+1

需要注意的是,這種方法的一個副作用是執行此語句將「使用」來自AUTO_INCREMENT列的值,即使執行UPDATE時也是如此。這不是問題,但是需要注意,因爲下一個問題很可能是,「*爲什麼我的product_id中存在空白?」 – spencer7593

+0

@ spencer7593有趣的評論!我只是放在一起SQLfiddle [鏈接](http://sqlfiddle.com/#!2/c99a3/1)進一步調查。在我看來,不希望的影響不存在。在我的示例中,我有一個產品列表,其中id = 8,然後我留下了一個空白,並在id = 10處插入了另一個產品。現在,下一個auto_increment位置將是11.當Insert .. On ..DUPLICATE語句帶有id = 9,它填補了空白,下一個「普通」插入仍然選擇id = 11作爲下一個空閒ID。 – cars10m

+0

(...用完字符之前)INSERT..ON Duplicate(當new_id = 3時)導致記錄3被更新,並且下一個「常規」插入在id = 11處發生。所以,據我所知,一切似乎都很好。 – cars10m