2012-04-05 37 views
0

這個問題在這裏:檢查上插入兩列使用MySQL的複製,但也不是唯一的

MySQL: INSERT IGNORE or ON DUPLICATE KEY UPDATE with checking multiple and not unique columns

是類似的,但並不完全。

我想建立一個觀察名單,使用表如下:

recordId | itemId | userId | dateAdded 

的recordId所是唯一unique柱和SS自動增量ID字段。

的itemId,帳戶及dateAdded可以單獨被複制,但不完全。

因此,如果用戶已經將產品添加到他/她的觀察名單,我希望它只是更新的設置DateAdded。

因此行可能包含多次相同的userId(因爲用戶可能希望「觀看」多個項目),並且它可能包含itemId很多次(因爲同一個項目可能被許多用戶「觀看」),而是與已存在的記錄相匹配的userId和itemId的組合應該會導致更新。

有一個單獨的語句辦法做到這一點,或者我需要嘗試插入前要問,如果userId = & postingUser & and itemId = & requestedId &數據庫?

+0

什麼是'dateAdded'列的類型? – 2012-04-05 15:55:20

+0

'dateAdded'是一個unix整數 – 2012-04-05 15:58:18

回答

1

這裏是你如何能做到這一點:

insert into <tablename> (itemId, userId) 
values (?, ?) 
on duplicate key update dateAdded = now(); 

其中的代表,你要插入

這是假設你已經定義了一個唯一索引(itemId, userId)新的價值觀?

CREATE TABLE <table> (
    `recordId` int(11) NOT NULL AUTO_INCREMENT, 
    `itemId` int(11) DEFAULT NULL, 
    `userId` int(11) DEFAULT NULL, 
    `dateAdded` timestamp, 
    PRIMARY KEY (`recordId`), 
    UNIQUE KEY itemuser (`itemId`,`userId`) 
) ENGINE=InnoDB; 

這是如何工作:

  • 當您嘗試插入一行,MySQL將檢查重點衝突
  • ,因爲你已經創建的,這將是檢查
  • (itemId, userId)的組合的唯一關鍵,如果沒有衝突,MySQL會繼續前進,插入行
  • 如果有衝突,MySQL將回落到on duplicate key條款,更新dateAdded列的值
+0

謝謝,有一段時間思考了這一點,我想我已經略微改變了我的計劃,刪除而不是更新記錄,我只是更改'更新'刪除?我猜是這樣,但我的下一個問題是,我將如何得到這樣的輸出通知用戶?即新功能是,當用戶點擊「添加到關注列表」時,它添加該項目,但是如果它已經被添加,它就起到了刪除按鈕的作用。 – 2012-04-07 11:25:30

相關問題