1 回答
TA贡献1874条经验 获得超12个赞
正如Nigel Ren所说,这是利用MySQLINSERT ... ON DUPLICATE KEYS语法的好地方。
为此,您只需要在 columns 上创建一个唯一约束(cart_id, product_id)。
ALTER TABLE mytable ADD CONSTRAINT my_table_constraint UNIQUE (cart_id, product_id);
请注意,要创建约束,现有数据必须符合要求(即,如果表中已有重复数据,则无法创建,需要先将其删除)。
现在,您可以使用以下查询简化整个代码:
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
如果您尝试在已经存在的(cart_id, product_id)元组上插入,那么 MySQL 会自动跳过插入并执行ON DUPLICATE KEYS子句中描述的更新命令。
除了使您的代码更短更简单之外,这种语法的另一个好处是可以有效地保护您免受竞争条件的影响:使用您现有的代码,两个同时运行的进程总是有可能插入重复的记录,而当使用上述,数据完整性由 MySQL 保证。
唯一的缺点是约束适用于对表执行的所有操作,它没有本地化到代码的特定部分。
- 1 回答
- 0 关注
- 196 浏览
添加回答
举报