2015-02-23 123 views
0

所以我有列如何插入新行或有效更新現有行?

product|user|time 

一個「recently_viewed」表。然而,如果用戶查看他們已經看到一個產品,它會創建一個新的行。覆蓋這種可能性的最有效方式是什麼(儘可能保證這是他們第一次看到它的可能性)?覆蓋他們查看舊時間或刪除舊錶格行(同時創建新行)?我可以想到一些效率低下的方法(首先查詢它是否在表中,但這需要多個語句),但我懷疑有更高效的方法。

INSERT INTO recent_viewed ...

真誠感謝您的任何幫助。非常感謝業餘愛好者。

+0

哪個DBMS? MySQL或SQL服務器? – Jens 2015-02-23 11:43:21

+0

使用'UPDATE表名稱 SET column1 = value1,column2 = value2,... WHERE some_column = some_value;' – itzMEonTV 2015-02-23 11:43:39

+0

mysql。 sql-server是一個建議的標籤,所以我點擊它。道歉。 – ambe5960 2015-02-23 11:43:50

回答

1

您可以使用定義(產品,用戶)作爲唯一的,例如你可以將其設置爲你的表的主鍵:

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

(或者你也可以創建唯一索引),然後使用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

+0

謝謝一堆。我可能會這樣做。有沒有理由說明,這是比標記爲正確的答案中使用的if/then語法更好的選項? – ambe5960 2015-02-23 12:08:14

+0

@ ambe5960這會更好地處理併發。如果多個用戶(或同一用戶的多個實例)同時查看同一產品會發生什麼情況?兩個實例同時選擇,什麼也沒得到,然後同時插入並且其中一個將失敗 – fthiella 2015-02-23 12:15:29

3

您可以檢查recently_viewed用戶記錄是否存在,

IF EXISTS (SELECT * FROM recently_viewed WHERE user = "user_id") 
BEGIN 
    #UPDATE query 
END 
ELSE 
BEGIN 
    #INSERT query 
END 
+0

非常感謝! – ambe5960 2015-02-23 11:56:54

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); 
+0

爲什麼重複鍵比我標記爲正確的答案要好? – ambe5960 2015-02-23 12:05:30

+1

@ ambe5960。 。 。首先,'if'只能在編程代碼中使用 - 存儲過程,觸發器和函數。你的問題沒有說明代碼是在編程模塊中。其次,找到記錄並修改它是在一個單獨的語句中完成的,所以如果其他線程正在修改表(除非包含在交易中,而未提及),則其他版本具有競爭條件。 – 2015-02-23 13:22:38

+0

謝謝!好信息。 – ambe5960 2015-02-23 21:59:41

相關問題