【问题标题】:How to check how many rows were updated and inserted in a ON DUPLICATE statement?如何检查在 ON DUPLICATE 语句中更新和插入了多少行?
【发布时间】:2021-01-03 20:23:39
【问题描述】:

我有这样的声明:

$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++;
}

问题是,我无法区分更新的行和插入的行。有没有办法我可以做到这一点? 我知道我可以使用受影响的行函数,但如果更新/插入,它的读数相同。有任何想法吗?谢谢!

【问题讨论】:

  • 此 SQL 语法不适用于 PostgreSQL。如果你的意思是INSERT ... ON CONFLICT,上次我查看受影响的行数是插入的行数。

标签: php sql postgresql upsert on-duplicate-key


【解决方案1】:

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

考虑到下表a记录..

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'),(2,'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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多