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

时间:2014-05-20 23:15:47

标签: php mysql pdo sql-update duplicates

这里我有这个mysql数据表:

enter image description here

所以当我有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才能更新,如果没有那么添加新行?

我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

如果两列的组合存在UNIQUE约束,例如

CREATE UNIQUE INDEX tabledata_UX1 ON tabledata (ID_polja,datum) ;

如果ID_polja和datum列的值与表中的另一行匹配,则此索引将不允许插入行。 (表中可以存在相同的ID_polja值,并且可以存在相同的数据值...它是两列必须唯一的组合。)

使用UNIQUE约束,您可以使用INSERT ... ON DUPLICATE KEY语句,例如:

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和datum列中的值相同。

但是这个带有ON DUPLICATE KEY子句的语句捕获了“重复键”错误,并导致执行UPDATE。更新操作(在此示例中)等同于运行此语句:

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语句将首先尝试INSERT,并且仅在INSERT抛出“重复键”异常时才执行UPDATE。


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