2016-03-03 160 views
0

我正在嘗試檢查客戶是否存在會話,以便我可以使用新會話詳細信息更新會話或爲客戶插入會話。我使用下面的語句:重複密鑰更新不只更新插入

INSERT INTO sessions (customerid, productlist, date) 
VALUES('33', '{"68":1,"72":1}', '2016-03-03 13:54:56') 
ON DUPLICATE KEY UPDATE customerid=VALUES(customerid) 

當我運行此,該語句插入客戶會話,即使已經存在會話。

+0

爲什麼不製作主鍵/唯一鍵?那麼它會錯誤的,如果它的重複 – KDOT

回答

-1

ON DUPLICATE KEY UPDATE需要表格上的UNIQUE INDEX。當INSERT由於UNIQUE INDEX而失敗時,它允許更新已經存在的行。

sessions表中的UNIQUE INDEX的候選人爲customerid。你有這樣的索引嗎?

無論如何,您發佈的查詢沒有任何意義。 ON DUPLICATE KEY UPDATE當你想要插入一個新行時,踢入,並且表中已經存在你想要放入的值customeridUNIQUE INDEX可以防止插入,ON DUPLICATE KEY UPDATE允許更新現有行的某些其他列。

customeridUNIQUE INDEX,customerid=VALUES(customerid)no-op

你可能想要的是:

INSERT INTO sessions (customerid, productlist, date) 
VALUES('33', '{"68":1,"72":1}', '2016-03-03 13:54:56') 
ON DUPLICATE KEY UPDATE productlist=VALUES(productlist), date=VALUES(date) 

SQL聲明作出customeridsessionsUNIQUE INDEX是:

ALTER TABLE `sessions` 
ADD UNIQUE INDEX `customerid` (`customerid`) 

,或者甚至更好,使是表的PRIMARY KEY(如果桌子還沒有一個:

ALTER TABLE `sessions` 
ADD PRIMARY KEY (`customerid`) 
-1

確保您使用以下項創建UNIQUE keycustomeridpdoructlist列。

+0

爲什麼添加'productlist'到索引? – axiac

+0

由於我猜測pdoructlist不夠獨特,您也可以使用該解決方案爲多個客戶共享重複會話,所以問題是:您爲什麼要限制自己? – divix

+0

這沒有任何意義。客戶來到網站(他們可能會認證自己,因爲他們有'客戶'),並將產品添加到購物車中。產品列表是存儲在'sessions'中的數據,'date'列包含會話/購物車的最後更新。它可能用於在一段時間後刪除舊條目。每個客戶都有一個會話和一個購物車。 – axiac