2015-04-21 127 views
1

我有一個SQL表,其中包含用戶可鏈接到其配置文件的項目列表。 SQL表看起來是這樣的:SQL語句INSERT,重複列UPDATE

Item_Activity_ID  Item_ID  User_ID  Status Date-Added  

    1     1   1    1   2015-06-08 
    2     2   2    1   2015-06-08 
    3     1   1    0   2015-06-09 

的條目顯示,有人用1個添加的項目編號1的ID的用戶的兩倍,這是唯一改變的事情是日期和狀態。我希望讓這個給定的INSERT語句,例如當:

INSERT INTO items (Item_ID, User_ID, Status, Date_Added) VALUES ('$x', '$y', 1, CURDATE()) IF EXISTS SOME Item_ID = $x AND User_ID = $y UPDATE items SET Status = 1, Date_Added = CURDATE() WHERE Item_ID = $x AND User_ID = $y 

Item_Activity_ID是auto_incremented主鍵索引。我怎樣才能在一個查詢中完成此操作?兩個用戶可以擁有相同的項目,但不應該重複同一用戶標識和項目標識的條目。

+1

存儲過程? –

回答

1
  • 首先,創建一個獨特的指數Item_ID, UserID組合,

  • 然後,使用INSERT ... ON DUPLICATE KEY UPDATE statement

    INSERT INTO items (Item_ID, User_ID, Status, Date_Added) 
    VALUES ('$x', '$y', 1, CURDATE()) 
    ON DUPLICATE KEY UPDATE Status = VALUES(Status), Date_Added = VALUES(Date_Added)) 
    

附:確保清理$x$y以防止SQL注入!

0

嘗試先執行更新,假定用戶和項目已經存在。然後檢查此更新是否影響任何行(在SQL Server中使用@@ rowcount)。 如果沒有,則執行插入。 不要忘記把上面的兩個語句放在一個事務中......;)

0

正常的方法是在db級別設置一個複合約束。如果您使用的是mysql和phpmyadmin,那麼可以在表結構視圖中執行此操作。

檢查這兩個字段(我猜'user_id'和'item_id')並單擊'唯一'按鈕。

之後,你可以只追加 ON DUPLICATE KEY UPDATE status =1, date_added=CURDATE()

它將更新侵犯您創建

約束
1

我會通過添加一個唯一鍵索引開始該行:

ALTER TABLE items 
ADD CONSTRAINT uc_UserItem UNIQUE (Item_ID,User_ID); 

然後,你可以修改你的插入查詢:

INSERT INTO items (Item_ID, User_ID, Status, Date_Added) VALUES ('$x', '$y', 1, CURDATE()) ON DUPLICATE KEY UPDATE Status=VALUES(1), Date_Added=VALUES(CURDATE());