PostgreSQL 9.5 dan UPSERT

Kabar baik bagi Anda penggemar database PostgreSQL!

PostgreSQL versi 9.5 yang masih dalam pengembangan akan mendapatkan fitur baru, yakni UPSERT. Fitur UPSERT secara garis besar adalah operasi gabungan UPDATE atau INSERT yang dilakukan secara atomik.

Salah satu operasi yang dapat memanfaatkan fitur UPSERT ini adalah ketika kita ingin menambahkan order item pada aplikasi e-commerce. Hal yang perlu diperhatikan adalah kita ingin menambahkan order item apabila order item tersebut belum ada untuk order tertentu, atau apabila ternyata sudah ada, maka kita cukup menambahkan kolom quantity pada order item tersebut.

Dengan contoh skema table order_item dibawah:

+-----------------+
| order_item      |
+-----------------+
| id (PK)         |
| order_id (FK)   |
| product_id (FK) |
| quantity        |
| ...             |
+-----------------+

Maka operasi untuk menambahkan order item di suatu order yang dibuat customer dapat dibuat sebagai berikut:

INSERT INTO "order_item" (order_id, product_id, quantity) VALUES (42, 24, 1) 
ON CONFLICT DO UPDATE SET quantity = quantity + 1;

Sebelum ada fitur UPSERT, maka yang bisa kita lakukan adalah mencoba INSERT, melihat apakah terjadi unique constraint violation dan apabila iya, kemudian mencoba meng-update row yang bersangkutan. Lalu kita juga harus memperhatikan apakah terjadi race condition yang akan menyebabkan duplicate record atau hal-hal lain yang dapat membuat operasi tersebut gagal.