web-dev-qa-db-fra.com

PostgreSQL INSERT ON CONFLICT UPDATE (upsert) utilise toutes les valeurs exclues

Lorsque vous transformez une ligne (PostgreSQL> = 9.5) et que vous voulez que l'INSERT possible soit exactement identique à la éventuelle UPDATE, vous pouvez l'écrire comme ceci:

INSERT INTO tablename (id, username, password, level, email) 
                VALUES (1, 'John', 'qwerty', 5, '[email protected]') 
ON CONFLICT (id) DO UPDATE SET 
  id=EXCLUDED.id, username=EXCLUDED.username,
  password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email

Y a-t-il un moyen plus court? Pour simplement dire: utilisez toutes les valeurs EXCLUDE.

Dans SQLite je faisais:

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
                        VALUES (1, 'John', 'qwerty', 5, '[email protected]')
100
Sebastian

Postgres n'a pas implémenté d'équivalent de INSERT OR REPLACE. De la ON CONFLICT docs (c'est moi qui souligne):

Il peut s'agir d'une clause DO UP ou d'une clause DO UPDATE spécifiant les détails exacts de l'action UPDATE à exécuter en cas de conflit.

Bien que cela ne vous donne pas un raccourci pour le remplacement, ON CONFLICT DO UPDATE s'applique plus généralement, car il vous permet de définir de nouvelles valeurs basées sur des données préexistantes. Par exemple:

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;
122
Kristján