这里我有这个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才能更新,如果没有那么添加新行?
我怎么能这样做?
答案 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。
这只是一种方法,还有其他(通常效率较低)的方法可以模拟相同的行为。