1. Ano ang UPSERT?
Pangkalahatang-ideya
Ang “UPSERT” ay tumutukoy sa isang operasyon ng database na pinagsasama ang parehong INSERT at UPDATE. Sa madaling sabi, kung ang data ay hindi pa umiiral, ito ay i-insert, at kung ito ay umiiral na, ito ay i-update. Ang tampok na ito ay nagbibigay-daan sa mahusay na operasyon habang pinapanatili ang pagkakapare-pareho ng data.
Sa MySQL, ang syntax na INSERT ... ON DUPLICATE KEY UPDATE ay nagbibigay ng functionality na ito. Sa tulong nito, maaari mong maiwasan ang mga error sa duplicate key at i-update ang umiiral na mga record kahit na mangyari ang mga sitwasyon ng duplicate data.
Mga Use Case
- Mga System ng Pamamahala ng Customer : Mag-insert ng bagong data ng customer kung hindi ito umiiral, o i-update ang umiiral na impormasyon ng customer kapag nagbago ito.
- Pamamahala ng Inventory : Magdagdag ng mga bagong produkto habang ini-update ang mga bilang ng stock ng umiiral na mga ito.
Mga Benepisyo ng UPSERT sa MySQL
- Naiiwasan ang mga error sa duplicate key
- Pinapadali ang mga SQL query
- Pinapanatili ang integridad ng data
2. Basic Usage ng UPSERT sa MySQL
Sa MySQL, ang mga operasyon ng UPSERT ay ipinatutupad gamit ang syntax na INSERT ... ON DUPLICATE KEY UPDATE. Sa tulong nito, kung matatagpuan ang duplicate key, ang umiiral na record ay i-update sa halip na mag-insert ng bago.
Basic Syntax
INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON DUPLICATE KEY UPDATE
column1 = value1, column2 = value2;
Paliwanag:
- Ang
INSERT INTOay nagsisikap na mag-insert ng data sa table. - Kung ang data ay umiiral na, ang clause na
ON DUPLICATE KEY UPDATEay ipinapatupad at ini-update ang umiiral na record.
Halimbawa:
INSERT INTO users (user_id, name)
VALUES (1, 'Taro Tanaka')
ON DUPLICATE KEY UPDATE
name = 'Taro Tanaka';
Sa halimbawang ito, kung may umiiral nang user na may user_id = 1, ang kanilang name ay i-update sa ‘Taro Tanaka’. Kung hindi, isang bagong record ang i-insert.

3. Detalyadong SQL Syntax at Mga Halimbawa para sa UPSERT
Pag-update ng Maraming Column
Kapag gumagamit ng UPSERT, maaari mong piliin na i-update lamang ang ilang column. Sa mga ganitong kaso, tukuyin lamang ang mga target column sa clause na ON DUPLICATE KEY UPDATE.
INSERT INTO products (product_id, name, price)
VALUES (100, 'Laptop', 50000)
ON DUPLICATE KEY UPDATE
price = VALUES(price);
Dito, kung may umiiral nang produkto na may product_id = 100, lamang ang column na price ang i-update, na nag-iiwan ng iba pang mga column tulad ng name na hindi binago.
4. Mga Pagkakaiba sa Iba Pang Database
Ang iba pang mga database ay nagbibigay din ng functionality na katulad ng UPSERT. Halimbawa, ang PostgreSQL at SQLite ay gumagamit ng INSERT ... ON CONFLICT o MERGE bilang kanilang katumbas.
Halimbawa sa PostgreSQL
INSERT INTO users (user_id, name)
VALUES (1, 'Taro Tanaka')
ON CONFLICT (user_id) DO UPDATE SET
name = 'Taro Tanaka';
Sa PostgreSQL at SQLite, ang clause na ON CONFLICT ay ginagamit upang kontrolin ang pag-uugali kapag nangyari ang mga error sa duplicate key. Sa paghahambing, ang MySQL ay gumagamit ng ON DUPLICATE KEY UPDATE.
Ang Pagkakakilanlan ng MySQL
- Ang MySQL ay gumagamit ng
INSERT ... ON DUPLICATE KEY UPDATE, na naiiba sa iba pang mga database. Kailangan ng espesyal na pansin sa panahon ng migration ng database.
5. Advanced Usage ng UPSERT
Bulk UPSERT (Maraming Record nang Sabay-Sabay)
Ang UPSERT ay maaari ring ilapat sa maraming record nang sabay-sabay, na nakakapagpapabuti nang malaki sa efficiency ng mga operasyon ng database.
INSERT INTO products (product_id, name, price)
VALUES
(100, 'Laptop', 50000),
(101, 'Smartphone', 30000)
ON DUPLICATE KEY UPDATE
price = VALUES(price);
Dito, maraming produkto ang ini-insert nang sabay-sabay, at kung may umiiral nang duplicate key, lamang ang price ang i-update.
Paggamit ng Stored Procedures para sa UPSERT
Maaari mo ring gumamit ng stored procedures upang gawing mas madali ang mga operasyon ng UPSERT. Ito ay nagdudulot ng reusability ng code, mas madaling basahin, at mas madaling mapanatili.

6. Mga Pitfall at Mga Isinasaalang-alang para sa UPSERT
Mga Transaksyon at Deadlocks
Kapag gumagamit ng UPSERT sa malalaking dataset, maaaring mangyari ang mga deadlock. Kung ang transaction isolation level ng MySQL ay nakatakda sa REPEATABLE READ, mas malamang na mangyari ang mga gap locks.
Pag-iwas sa Gap Locks
- Ang pagbabago ng antas ng pag-iisa ng transaksyon sa
READ COMMITTEDay maaaring magpababa ng panganib ng deadlock. - Isaalang-alang ang paghahati ng mga operasyon ng UPSERT sa mas maliliit na kung kinakailangan.
7. Konklusyon
Ang UPSERT functionality ng MySQL ay isang makapangyarihang kasangkapan para sa pagpasok at pag-update ng data nang epektibo habang iniiwasan ang mga duplicate key error. Gayunpaman, mahalagang isaalang-alang ang mga setting ng transaksyon at posibleng mga deadlock. Kapag ginamit nang tama, maaaring gawing mas simple at mas epektibo ang mga operasyon sa database ang UPSERT.


