2016-04-01 20 views
43

Bir sıraya (PostgreSQL> = 9.5) güç katıyorsanız ve olası INSERT'in olası UPDATE ile tam olarak aynı olmasını istiyorsanız, bu şekilde yazabilirsiniz. :PostgreSQL CONFLICT GÜNCELLENMESİ ÜZERİNDEN KURTARMA (yükseltin) hariç tutulan tüm değerleri kullanın

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 

Daha kısa bir yol var mı? Sadece söylemek için: tüm EXCLUDE değerlerini kullanın.

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

Gerçek bir cevap ama biraz kısa bir süre notasyonu kullanabilirsiniz: '1 (tabloismi INTO (id, kullanıcı adı, parola, seviye, e-posta) VALUES INSERT, 'John', 'qwerty', 5 , '[email protected]') AÇIK ÇIKIŞ (id) DO UPDATE SET (kullanıcı adı, parola, seviye, e-posta) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email). aynı, ama kopyalamak/yapıştırmak/sütun listesini yönetmek – foal

+0

Başka bir seçenek jsonb sütunları kullanmaktır ve bu şekilde sütunlar hakkında endişelenmenize gerek yok –

cevap

53

Postgres INSERT OR REPLACE bir eşdeğerini uygulanmadı etti:

SQLite ben yapardım. ON CONFLICT docs (vurgu mayın) Gönderen:

Olmak ya hiçbir şey veya GÜNCELLEME eylem kesin bilgi belirten bir DO GÜNCELLEME hükmü bir çelişki olması durumunda yapılacak yapabilirsiniz. Eğer önceden var verilere dayalı yeni değerler ayarlamanıza izin verir çünkü

Eğer değiştirme için steno vermez rağmen, ON CONFLICT DO UPDATE daha genel geçerlidir. Örneğin:

INSERT INTO users (id, level) 
VALUES (1, 0) 
ON CONFLICT (id) DO UPDATE 
SET level = users.level + 1; 
İlgili konular