Ketika Anda memasang baris (PostgreSQL> = 9.5), dan Anda ingin INSERT yang mungkin persis sama dengan UPDATE yang mungkin, Anda dapat menulisnya seperti ini:
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
Apakah ada cara yang lebih pendek? Untuk sekadar mengatakan: gunakan semua nilai EXCLUDE.
Dalam SQLite saya biasa melakukan:
INSERT OR REPLACE INTO tablename (id, user, password, level, email)
VALUES (1, 'John', 'qwerty', 5, '[email protected]')
postgresql
upsert
postgresql-9.5
Sebastian
sumber
sumber
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).
Hampir sama, tetapi mudah untuk menyalin / menempel / mengelola daftar kolomJawaban:
Postgres belum menerapkan yang setara dengan
INSERT OR REPLACE
. DariON CONFLICT
dokumen (penekanan pada saya):Meskipun tidak memberi Anda singkatan untuk penggantian,
ON CONFLICT DO UPDATE
berlaku lebih umum, karena memungkinkan Anda menetapkan nilai baru berdasarkan data yang sudah ada sebelumnya. Sebagai contoh:sumber