Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL语句插入,在重复列更新时_Php_Mysql_Sql - Fatal编程技术网

Php 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

我有一个SQL表,其中包含用户可以链接到其配置文件的项目列表。SQL表如下所示:

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());