2016-12-02 58 views
1

這裏的表設計的cartitems表使用WHERE在對重複密鑰更新列第

cartitems

cartitem_id PK AI 
customer_id FK 
item_id FK UNIQUE 
item_quantity INT DEFAULT 1 

我需要完成

1)如果存在item_id什麼表增加item_quantity 每次用戶點擊「加入購物車「按鈕爲相同item_id

2)如果item_id尚不存在,則運行insert語句。

所以我做了這個。

CREATE DEFINER=`root`@`localhost` PROCEDURE `addItemToCart`(aCustomerId int, aProductId int) 
    BEGIN 
     INSERT INTO cart_items(customer_id,product_id) 
     VALUES(aCustomerId,aProductId) 

     ON DUPLICATE KEY UPDATE 
     item_quantity = item_quantity + 1 

     WHERE customer_id = aCustomerId AND item_id = aProductId; 
    END 

但是,當我檢查了,我得到一個錯誤,指出,在missing semicolonitem_quantity = item_quantity + 1

我無法弄清楚是什麼導致了錯誤。我不知道WHERE條款是否有問題。

我很感激任何幫助。

謝謝。

回答

0

ON DUPLICATE KEY UPDATE的行爲得到了很好的documentation解釋說:

如果你指定ON DUPLICATE KEY UPDATE,行插入,將導致在一個唯一索引或主鍵的重複值時,MySQL執行舊行的更新

查看您的表格,您想要增加給定客戶購物車的物品數量。我在這裏假設一個客戶一次只能有一個購物車。所以,要在其下的MySQL執行UPDATE而不是INSERT條件是當客戶項目已經出現在表格中。

爲此,您可以創建通過這兩個列的唯一索引:

CREATE UNIQUE INDEX unq_item_index ON cart_items (customer_id, item_id); 

然後,您可以使用以下INSERT查詢:

INSERT INTO cart_items (customer_id, item_id) 
VALUES 
    (aCustomerId, anItemId) 

ON DUPLICATE KEY UPDATE 
item_quantity = item_quantity + 1 

WHERE customer_id = aCustomerId AND 
     item_id = anItemId; 

現在的行爲將是如果客戶/項目的新條目進入,則item_quantity將設置爲默認值1,否則item_quantity將增加1

0
BEGIN 

IF NOT EXISTS(SELECT 1 FROM cart_items WHERE item_id = aProductId) 
BEGIN 
    INSERT INTO cart_items(customer_id,product_id) 
    VALUES(aCustomerId,aProductId) 
END 
ELSE 
    UPDATE cart_items SET item_quantity = item_quantity + 1 WHERE customer_id = aCustomerId AND item_id = aProductId; 
END 
0

你爲什麼要嘗試使用WHERE條款呢?這沒有意義。如果DUPLICATE KEY發生,它將更新您指定給具有相同密鑰的舊記錄的任何字段。所以,如果你只是刪除WHERE條款它應該工作。檢查this article。它指出以下兩種:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

UPDATE table SET c=c+1 WHERE a=1; 

是一樣的。