Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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 使用两个键插入或更新副本_Php_Mysql_Pdo_Sql Update_Duplicates - Fatal编程技术网

Php 使用两个键插入或更新副本

Php 使用两个键插入或更新副本,php,mysql,pdo,sql-update,duplicates,Php,Mysql,Pdo,Sql Update,Duplicates,这里有一个mysql数据表: 所以当我有重复的ID_polja和datum时,我想要更新,所以当ID_polja和datum是相同的,如果不是,那么只需添加新行。。。 是否有任何php pdo查询来执行此操作 我尝试: $STH = $conn->prepare("INSERT INTO vremenska (ID_polja,datum,verov_kisa,mm_kisa) VALUES ( :ID_polja, :datum, :verov_kisa,:mm_kisa) on d

这里有一个mysql数据表:

所以当我有重复的ID_polja和datum时,我想要更新,所以当ID_polja和datum是相同的,如果不是,那么只需添加新行。。。 是否有任何php pdo查询来执行此操作

我尝试:

 $STH = $conn->prepare("INSERT INTO vremenska (ID_polja,datum,verov_kisa,mm_kisa) VALUES ( :ID_polja, :datum, :verov_kisa,:mm_kisa) on duplicate key update verov_kisa=values(verov_kisa), mm_kisa=values(mm_kisa)");
这个查询是可以的,但是我有一个问题,我需要ID_polja和datum都是相同的来更新,如果不是,那么要添加新行吗


如何做到这一点?

如果对两列的组合有唯一的约束,例如

CREATE UNIQUE INDEX tabledata_UX1 ON tabledata (ID_polja,datum) ;
如果ID_polja和datum列的值与表中的另一行匹配,则此索引不允许插入行。(表中可以存在相同的ID_polja值,也可以存在相同的datum值……两列的组合必须是唯一的。)

使用唯一约束,您可以使用
插入。。。在重复键上
语句,例如:

INSERT INTO tabledata (ID_polja, datum, temp, verov_kisa)
VALUES ('94','2014-05-25',0,0.87)
ON DUPLICATE KEY
UPDATE temp = VALUES(temp)
     , verov_kisa = VALUES(verov_kisa)
当新行尝试插入与另一行匹配的行时,普通INSERT语句将抛出一个错误,该行在ID_polja和DATAM列中具有相同的值

但是,这个带有ON DUPLICATE KEY子句的语句捕获“DUPLICATE KEY”错误,并导致执行更新。更新操作(在本例中)相当于运行以下语句:

UPDATE tabledata
   SET temp = 0
     , verov_kisa = 0.87 
 WHERE ID_polja = '94'
   AND datum = '2014-05-25'
该语句将为INSERT操作返回受影响的行数1,为UPDATE操作返回受影响的行数2

请注意,
INSERT。。。ON DUPLICATE KEY
语句将首先尝试插入,并且仅当插入引发“DUPLICATE KEY”异常时才执行更新



这只是一种方法,还有其他(通常效率较低)方法来模拟相同的行为。

为字段添加唯一索引我添加了它,但不是它的解决方案,因为不同行中的数据可能相同,ID也可能相同,但当两个字段在同一行中相同时,我必须更新字段…例如:当ID_polja=94和datum 2014.05.25时,我必须更新verov kisa u mm_kisa…可能是在列ID_polja+datum中创建新列和字符串的唯一解决方案。。。然后,为了使该列唯一,为什么不使用if-else块来比较变量呢?如果相同,那么更新ID_polja=$var1和datum=$var2的记录。否则,插入一个新的记录是的,这是一个好的解决方案,但我创建了一个列和总和ID_polja和数据,所以在这之后做这个唯一的。。。你认为>是一个好方法吗?不管违反了什么独特的约束,这些都是更新的(有效)WHERE子句中的列。谢谢你的回答@spencer7593