sql >> Database >  >> RDS >> PostgreSQL

Detecteren of de rij is bijgewerkt of ingevoegd

U kunt kijken in de systeemkolom xmax om het verschil te vertellen. Het is 0 voor ingevoegde rijen in dit geval.

CREATE TABLE tbl(id int PRIMARY KEY, col int);
INSERT INTO tbl VALUES (1, 1);
INSERT INTO tbl(id, col)
VALUES (1,11), (2,22)
ON     CONFLICT (id) DO UPDATE
SET    col = EXCLUDED.col
RETURNING *, (xmax = 0) AS inserted;

Dit bouwt voort op een ongedocumenteerd implementatiedetail dat in toekomstige releases zou kunnen veranderen (zelfs als het onwaarschijnlijk is). Het werkt voor Postgres 9.5 en 9.6.

Het mooie ervan:u hoeft geen extra kolommen in te voeren.

Gedetailleerde uitleg:

  • PostgreSQL Upsert maakt onderscheid tussen ingevoegde en bijgewerkte rijen met behulp van systeemkolommen XMIN, XMAX en andere



  1. Hoe MySQL-databases te beschermen tegen ransomware-campagnes

  2. Oracle invoegen als rij niet bestaat

  3. Maximale waarde halen uit rijen en deelnemen aan een andere tabel

  4. Hoe waarden dynamisch doorgeven aan de IN-operator?