2015-04-21 52 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());