1 回答

TA貢獻1874條經(jīng)驗 獲得超12個贊
正如Nigel Ren所說,這是利用MySQLINSERT ... ON DUPLICATE KEYS語法的好地方。
為此,您只需要在 columns 上創(chuàng)建一個唯一約束(cart_id, product_id)。
ALTER TABLE mytable ADD CONSTRAINT my_table_constraint UNIQUE (cart_id, product_id);
請注意,要創(chuàng)建約束,現(xiàn)有數(shù)據(jù)必須符合要求(即,如果表中已有重復數(shù)據(jù),則無法創(chuàng)建,需要先將其刪除)。
現(xiàn)在,您可以使用以下查詢簡化整個代碼:
INSERT INTO mytable
(cart_id, product_id, attributes, quantity, added_on)
VALUES (:cart, :product_id, :attributes, 1, 1, NOW())
ON DUPLICATE KEYS UPDATE quantity = quantity + 1, buy_now = true
如果您嘗試在已經(jīng)存在的(cart_id, product_id)元組上插入,那么 MySQL 會自動跳過插入并執(zhí)行ON DUPLICATE KEYS子句中描述的更新命令。
除了使您的代碼更短更簡單之外,這種語法的另一個好處是可以有效地保護您免受競爭條件的影響:使用您現(xiàn)有的代碼,兩個同時運行的進程總是有可能插入重復的記錄,而當使用上述,數(shù)據(jù)完整性由 MySQL 保證。
唯一的缺點是約束適用于對表執(zhí)行的所有操作,它沒有本地化到代碼的特定部分。
- 1 回答
- 0 關注
- 215 瀏覽
添加回答
舉報