2016-03-03 115 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