Php 如何检查ON DUPLICATE语句中更新和插入了多少行?
我有一句话是这样的:Php 如何检查ON DUPLICATE语句中更新和插入了多少行?,php,sql,postgresql,upsert,on-duplicate-key,Php,Sql,Postgresql,Upsert,On Duplicate Key,我有一句话是这样的: $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 (?,?,
$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++;
}
问题是,我无法在更新的行和插入的行之间进行解码。我有办法做到这一点吗?
我知道我可以使用impfected rows函数,但是如果更新/插入,它的读取结果是相同的。有什么想法吗?谢谢 您正在寻找带有返回
子句的
考虑到下表a记录
CREATE TEMPORARY TABLE t
(id INT PRIMARY KEY, name TEXT);
INSERT INTO t VALUES (1,'elgar'),(2,'bach'),(3,'brahms');
。。您可以使用UPSERT
捕获主键冲突,并要求查询返回受影响的记录。您可以将此插入放入一个数组中,并使用新查询对其进行计数。以下查询将插入两个现有主键(1
和2
)和一个新主键(4
):
亲自查看结果:-)
此SQL语法不适用于PostgreSQL。如果你的意思是插入。。。在冲突中,我上次查看受影响的行数是插入的行数。
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