如何检查在ON DUPLICATE语句中已更新并插入了多少行?

问题描述

我有一个看起来像这样的声明:

$count=0;
while($row = pg_fetch_assoc($result)){
$sql=("INSERT INTO joblist (job_no,billed,completed,paid,paid_amount,inv_no,invoice,type,o_submitted,approval_date,gals,jobtype,name,state,region,territory) 
VALUES (?,?,?) ON DUPLICATE KEY UPDATE
job_no=VALUES(job_no),billed=VALUES(billed),completed=VALUES(completed),paid=VALUES(paid),paid_amount=VALUES(paid_amount),inv_no=VALUES(inv_no),invoice=VALUES(invoice),type=VALUES(type),o_submitted=VALUES(o_submitted),approval_date=VALUES(approval_date),gals=VALUES(gals),jobtype=VALUES(jobtype),name=VALUES(name),state=VALUES(state),region=VALUES(region),territory=VALUES(territory)");
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssssssssssssssss",$job_no,$billed,$completed,$paid,$paid_amount,$inv_no,$invoice,$type,$o_submitted,$approval_date,$gals,$jobtype,$name,$state,$region,$territory);
$stmt->execute();
$count++;
}

问题是,我无法在更新的行和插入的行之间进行解密。有办法吗? 我知道我可以使用受影响的行功能,但是如果更新/插入,它读取的内容相同。有任何想法吗?谢谢!

解决方法

您正在寻找带有RETURNING子句的UPSERT

考虑到下表中的记录..

CREATE TEMPORARY TABLE t 
(id INT PRIMARY KEY,name TEXT);

INSERT INTO t VALUES (1,'elgar'),(2,'bach'),(3,'brahms');

..您可以使用UPSERT来捕获主键冲突,并要求查询返回受影响的记录。您可以将此插入内容放在CTE中,并用新的查询计数。以下查询将插入两个已经存在的主键(12)和一个新的主键(4):

WITH j (affected_rows) AS (
  INSERT INTO t VALUES (1,'edward'),'johann sebastian'),(4,'schubert')
  ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name
  RETURNING *
) SELECT count(affected_rows) FROM j;

  count 
-------
     3

亲自查看结果:-)

SELECT * FROM t ORDER BY id;
 id |       name       
----+------------------
  1 | edward
  2 | johann sebastian
  3 | brahms
  4 | telemann