1. UPSERT ni Nini?
Muhtasari
“UPSERT” inahusu kipengele cha hifadhidata kinachochanganya shughuli za “INSERT” na “UPDATE”. Kwa maneno mengine, ikiwa data haipo tayari, itaingizwa; ikiwa data ile ile tayari ipo, itasasishwa. Kwa kutumia kipengele hiki, unaweza kufanya shughuli kwa ufanisi huku ukidumisha usawa wa data.
Katika MySQL, kipengele hiki kinatekelezwa kwa kutumia sintaksia ya INSERT ... ON DUPLICATE KEY UPDATE. Kipengele hiki kinakuwezesha kuepuka makosa ya funguo za kurudia na kusasisha rekodi zilizopo hata wakati funguo za kurudia zinatokea.
Matumizi
- Mifumo ya Usimamizi wa Wateja : Ongeza data mpya ya mteja ikiwa haipo, na sasisha taarifa za wateja zilizopo wakati zinabadilika.
- Usimamizi wa Hisa za Bidhaa : Ongeza bidhaa mpya huku ukisasaisha kiasi cha hisa cha bidhaa zilizopo.
Faida za UPSERT katika MySQL
- Huinzui makosa ya funguo za kurudia
- Inarahisisha maswali ya SQL
- Inadumisha uadilifu wa data
2. Matumizi ya Msingi ya UPSERT katika MySQL
Katika MySQL, shughuli za UPSERT hufanywa kwa kutumia sintaksia ya INSERT ... ON DUPLICATE KEY UPDATE. Kwa sintaksia hii, ikiwa funguo ya kurudia itatokea, unaweza kusasisha sehemu au data yote iliyopo badala ya kuingiza data mpya.
Sintaksia ya Msingi
INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON DUPLICATE KEY UPDATE
column1 = value1, column2 = value2;
Maelezo:
- Tumia
INSERT INTOkuingiza data. - Ikiwa data inayoinjizwa tayari ipo kwenye jedwali, kifungu cha
ON DUPLICATE KEY UPDATEkinatekelezwa, na data iliyopo inasasishwa.
Mfano:
INSERT INTO users (user_id, name)
VALUES (1, 'Taro Tanaka')
ON DUPLICATE KEY UPDATE
name = 'Taro Tanaka';
Katika mfano hapo juu, ikiwa mtumiaji mwenye user_id ya 1 tayari ipo, sehemu ya name itasasishwa kuwa ‘Taro Tanaka’. Ikiwa mtumiaji haipo, rekodi mpya itaingizwa. 
3. Sintaksia ya Kina ya SQL na Mifano ya UPSERT
Kusasisha Safu Nyingi
Unapotumia UPSERT, kuna hali ambapo unaweza kutaka kusasisha safu maalum pekee. Katika hali hizo, unaweza kubainisha safu zinazohitajika tu katika kifungu cha ON DUPLICATE KEY UPDATE.
INSERT INTO products (product_id, name, price)
VALUES (100, 'Laptop', 50000)
ON DUPLICATE KEY UPDATE
price = VALUES(price);
Katika mfano huu, ikiwa bidhaa yenye product_id 100 tayari ipo, safu ya price pekee itasasishwa, wakati safu zingine (kama name) hazibadiliki.
4. Tofauti na Hifadhidata Nyingine
Hifadhidata zisizo MySQL pia hutoa kipengele sawa. Kwa mfano, PostgreSQL na SQLite hutumia tamko la INSERT ... ON CONFLICT au MERGE ili kufanikisha tabia ya UPSERT.
Mfano wa PostgreSQL
INSERT INTO users (user_id, name)
VALUES (1, 'Taro Tanaka')
ON CONFLICT (user_id) DO UPDATE SET
name = 'Taro Tanaka';
Katika PostgreSQL na SQLite, kifungu cha ON CONFLICT kinatumika kudhibiti tabia wakati makosa ya funguo za kurudia yanatokea. Kinyume chake, MySQL hutumia kifungu cha ON DUPLICATE KEY UPDATE.
Sifa Maalum za MySQL
- MySQL hutumia
INSERT ... ON DUPLICATE KEY UPDATE, na kwa kuwa sintaksia inatofautiana na hifadhidata nyingine, uangalizi maalum unahitajika wakati wa kuhamisha kati ya mifumo.
5. Mbinu za Juu za UPSERT
UPSERT ya Wingi (Ushughulikiaji wa Batch wa Rekodi Nyingi)
UPSERT inaweza kutekelezwa si kwa rekodi moja tu bali pia kwa rekodi nyingi kwa wakati mmoja. Hii inaboresha sana ufanisi wa shughuli za hifadhidata.
INSERT INTO products (product_id, name, price)
VALUES
(100, 'Laptop', 50000),
(101, 'Smartphone', 30000)
ON DUPLICATE KEY UPDATE
price = VALUES(price);
Katika mfano huu, rekodi nyingi za bidhaa zinaingizwa kwa wakati mmoja. Ikiwa funguo za kurudia zipo, sehemu ya price ya rekodi husika pekee itasasishwa.
Kutumia Procedures Zilizohifadhiwa kwa UPSERT
Ili kuboresha usindikaji wa UPSERT, unaweza pia kutumia taratibu zilizohifadhiwa. Hii inakuwezesha kuunda mantiki inayoweza kutumika tena ndani ya hifadhidata, kuboresha usomaji na matengenezo ya msimbo wako.
6. Vizingiti vya Kawaida na Mambo Muhimu ya Kuzingatia
Mikataba na Vizuizi
Unapotumia UPSERT—haswa na kiasi kikubwa cha data—vizuizi vinaweza kutokea. Ikiwa kiwango cha upatikanaji wa mikataba cha MySQL kimewekwa kuwa REPEATABLE READ, kufungwa kwa mapengo kunakuwa zaidi kutokea.
Kuepuka Kufungwa kwa Mapengo
- Unaweza kupunguza uwezekano wa vizuizi kwa kubadilisha kiwango cha upatikanaji wa mikataba kuwa
READ COMMITTED. - Ikiwa ni lazima, fikiria kugawanya operesheni kubwa ya UPSERT katika batch ndogo ndogo na kutekeleza maswali mengi badala ya tamko moja kubwa.
7. Hitimisho
Kipengele cha MySQL UPSERT ni cha manufaa sana kwa kurahisisha uingizaji wa data na masasisho huku kuepuka makosa ya funguo zilizojirudia. Hata hivyo, kutekeleza UPSERT kunahitaji kuzingatia kwa umakini vizuizi vinavyowezekana na mipangilio ya mikataba. Ikitumika ipasavyo, kinaruhusu operesheni za hifadhidata kuwa rahisi na bora zaidi.


