Lorsque vous insérez une ligne (PostgreSQL> = 9.5), et que vous voulez que le possible INSERT soit exactement le même que le possible 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 dire simplement: 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]')
postgresql
upsert
postgresql-9.5
Sébastien
la source
la source
INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, '[email protected]') ON CONFLICT (id) DO UPDATE SET (username, password, level, email) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email).
presque la même chose, mais facile à copier / coller / gérer la liste des colonnesRéponses:
Postgres n'a pas implémenté d'équivalent à
INSERT OR REPLACE
. Extrait de laON CONFLICT
documentation (c'est moi qui souligne):Bien que cela ne vous donne pas de raccourci pour le remplacement,
ON CONFLICT DO UPDATE
s'applique plus généralement, car il vous permet de définir de nouvelles valeurs en fonction de données préexistantes. Par exemple:la source