Kiedy dodajesz wiersz (PostgreSQL> = 9.5) i chcesz, aby możliwe INSERT było dokładnie takie samo, jak możliwe UPDATE, możesz napisać to w ten sposób:
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
Czy istnieje krótsza droga? Po prostu powiedzieć: użyj wszystkich wartości EXCLUDE.
W SQLite robiłem:
INSERT OR REPLACE INTO tablename (id, user, password, level, email)
VALUES (1, 'John', 'qwerty', 5, '[email protected]')
postgresql
upsert
postgresql-9.5
Sebastian
źródło
źródło
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).
Prawie taka sama, ale łatwa do skopiowania / wklejenia / zarządzania listą kolumnOdpowiedzi:
Postgres nie zaimplementował odpowiednika
INSERT OR REPLACE
. ZON CONFLICT
dokumentacji (moje podkreślenie):Chociaż nie daje skrótu do wymiany,
ON CONFLICT DO UPDATE
ma bardziej ogólne zastosowanie, ponieważ pozwala ustawić nowe wartości w oparciu o istniejące dane. Na przykład:źródło