019. UPSERT va MERGE
Bu mavzuda ON CONFLICT va MERGE bo'yicha 20 ta masala bor. Har bir masala oldida qavs ichida sxema nomi va qiyinlik darajasi ko'rsatilgan. Sxemalar Sxemalar va tayyorlov sahifasida berilgan.
Masalani o'zingiz yechib, natijani Kutilgan natija bilan solishtiring. O'zgartiruvchi masalalarda (INSERT, UPDATE, DELETE, DDL) natija shartda aytilgan tekshiruv so'rovidan olingan. Natija 10 qatordan ko'p bo'lsa, birinchi 10 qator ko'rsatilgan.
1. (dokon, oson) INSERT ... ON CONFLICT DO NOTHING: kategoriya (1,'Boshqa') ni qo'shishga urining — mavjud id; tekshirish: 1-kategoriya nomi.
2. (dokon, oson) UPSERT: kategoriya (1,'Elektronika buyumlari') — mavjud bo'lsa nomini yangilang; tekshirish: 1-kategoriya nomi.
3. (dokon, oson) UPSERT: yangi kategoriya (9,'Yangi') — mavjud emas, qo'shilsin; tekshirish: soni.
4. (dokon, o'rta) Mahsulot (id=1) bor: qoldiqni 5 taga oshiruvchi upsert (qoldiq = mahsulot.qoldiq + EXCLUDED.qoldiq).
5. (dokon, o'rta) Ikki qatorli upsert: kategoriya 5 (mavjud) va 8 (yangi), RETURNING id, nom, natijani chiqaring.
6. (dokon, o'rta) MERGE: vaqtinchalik jadvaldagi yangi narxlar (id=1,2) bilan mahsulot narxini yangilang.
7. (dokon, o'rta) MERGE: yangi mijoz (id=200) bo'lsa qo'shilsin, bor bo'lsa shahri yangilansin (id=1 uchun).
8. (dokon, qiyin) MERGE ... WHEN MATCHED AND ... THEN DELETE: qoldig'i 0 yoki undan kam bo'lganlarni (yangi qoldiqlar jadvali orqali) o'chiring; id=1 uchun qoldiq 0 qilinsin (buyurtma_element bog'liqligini hisobga olib avval o'chirmasdan, mahsulot 21 ni ishlating).
9. (dokon, qiyin) MERGE ... RETURNING (PG17): id=1 narxini 1 so'mga o'zgartiring va merge_action(), id ni qaytaring.
10. (maktab, oson) UPSERT: fan (1,'Algebra') — id mavjud; nomi yangilansin.
11. (maktab, o'rta) DO NOTHING: ikki fan: biri mavjud (2), biri yangi (10) — faqat yangisi qo'shilsin.
12. (maktab, o'rta) MERGE: o'qituvchi maoshlarini yangi (id,maosh) jadvali bilan yangilash va yangilarini qo'shish (id=1 mavjud, id=50 yangi).
13. (bank, oson) UPSERT: filial (1,'Bosh filial','Toshkent').
14. (bank, o'rta) Hisob balansiga upsert: id=1 hisobga +1000 qo'shuvchi upsert (balans = hisob.balans + EXCLUDED.balans).
15. (bank, o'rta) MERGE: yangi balanslar (id 1,2) bilan hisoblar yangilansin, mavjud bo'lmagan id=99 qo'shilsin.
16. (bank, qiyin) MERGE: nolga teng balansli hisoblarni o'chirish va qolganlarini 1% oshirish qoidasi (id 1 va 2 uchun balansni 0 qilib sinab ko'ring: avval tranzaksiyalarini o'chiring).
17. (kutubxona, oson) UPSERT: janr (1,'Badiiy') yangilansin.
18. (kutubxona, o'rta) DO NOTHING bilan a'zo qo'shish: id=1 (mavjud) va id=30 (yangi).
19. (kutubxona, o'rta) Kitob nusxasi upsert: id=1 kitobga nusxa +3 (EXCLUDED.nusxa qo'shilsin).
20. (kutubxona, qiyin) MERGE: ijara qaytarish — qaytarilmagan ijaralar (id 5,10) uchun qaytarilgan sanani qo'ying, bunday id=9999 yo'q bo'lsa e'tiborsiz.