如何有效地插入新行或更新现有行?

时间:2015-02-23 11:39:13

标签: mysql sql

所以我有一个带有列

的'recent_viewed'表
product|user|time

但是,如果用户查看他们已查看过的产品,则会创建一个新行。什么是最有效的方式来覆盖这种可能性(同时保持这是他们第一次看到它的可能性)?覆盖他们查看它的旧时间或删除旧表行(并同时创建新行)?我可以想到一些效率低下的方法(首先查询它是否在表中,但这需要多个语句),但我怀疑有更高效的东西。

INSERT INTO recent_viewed ...

真诚地感谢您的帮助。非常感谢业余爱好者。

3 个答案:

答案 0 :(得分:3)

您可以在recently_viewed

中查看用户记录是否存在
IF EXISTS (SELECT * FROM recently_viewed WHERE user = "user_id")
BEGIN
   #UPDATE query
END
ELSE
BEGIN
   #INSERT query
END

答案 1 :(得分:1)

您可以将define(product,user)用作UNIQUE,例如,您可以将其设置为表的PRIMARY KEY:

CREATE TABLE tablename (
  product INT,
  user INT,
  time DATETIME,
  PRIMARY KEY (product, user)
);

(或者你也可以创建一个UNIQUE索引),然后使用INSERT INTO ... ON DUPLICATE查询:

INSERT INTO tablename (product, user, `time`)
VALUES (1, 1, '2015-01-01 10:00:00'),
ON DUPLICATE KEY UPDATE `time`=VALUES(`time`);

请参阅工作示例here

答案 2 :(得分:1)

我强烈建议使用on duplicate key update。这首先是user / product上的唯一索引:

create unique index idx_recently_viewed_user_product on recently_viewed(user, product);

然后:

insert into recently_viewed(user, product, time)
    values ($user, $product, $time)
    on duplicate key update time = values(time);