Как проверить, сколько строк было обновлено и вставлено в инструкцию 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++;
}

Проблема в том, что я не могу расшифровать обновленные строки и вставленные строки. Есть ли способ сделать это? Я знаю, что могу использовать функцию обработанных строк, но она читается так же, если обновлена/вставлена. Любые идеи? Благодарность!


person Dimitri Bostrovich    schedule 17.09.2020    source источник
comment
Этот синтаксис SQL не будет работать с PostgreSQL. Если вы имеете в виду INSERT ... ON CONFLICT, в прошлый раз, когда я смотрел, количество затронутых строк было количеством вставленных строк.   -  person Laurenz Albe    schedule 17.09.2020


Ответы (1)


Вы ищете UPSERT с предложением RETURNING.

Принимая во внимание следующую таблицу, записи ..

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

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

.. вы можете использовать UPSERT, чтобы поймать конфликт первичного ключа и попросить запрос вернуть затронутые записи. Вы можете поместить эту вставку в CTE и считать ее с новым запрос. Следующий запрос вставит два уже существующих первичных ключа (1 и 2) и новый (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
person Jim Jones    schedule 17.09.2020