Php SQL语句插入,在重复列更新时
我有一个SQL表,其中包含用户可以链接到其配置文件的项目列表。SQL表如下所示:Php SQL语句插入,在重复列更新时,php,mysql,sql,Php,Mysql,Sql,我有一个SQL表,其中包含用户可以链接到其配置文件的项目列表。SQL表如下所示: Item_Activity_ID Item_ID User_ID Status Date-Added 1 1 1 1 2015-06-08 2 2 2 1 2015
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
条目显示id为1的用户添加了两次item id 1,唯一更改的是日期和状态。我希望这样,当给出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是一个自动递增的主键索引。如何在一个查询中实现这一点?两个用户可以拥有相同的项目,但其中不应重复相同用户id和项目id的条目。- 首先,为
组合创建唯一索引Item\u ID,UserID
- 然后,使用以下命令:
注意:确保对
$x
和$y
进行消毒,以防止SQL注入 假设用户和项目已存在,请首先尝试执行更新。然后检查此更新是否影响任何行(在SQL Server中使用@@rowcount)。
如果没有,则执行插入。
别忘了把上面两条语句放在一个事务中…;) 通常的方法是在db级别设置复合约束。如果您使用的是mysql和phpmyadmin,那么可以在表结构视图中执行此操作 检查两个字段(我猜是“用户id”和“项目id”),然后单击“唯一”按钮 设置之后,您只需附加
重复密钥更新状态=1,添加日期=CURDATE()
它将更新违反您创建的约束的行我将首先添加一个唯一的键索引:
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());
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());