4-bo‘lim
INSERT - ma'lumot qo'shish
Bitta va ko'p qator qo'shish, standart qiymatlar, INSERT IGNORE, ON DUPLICATE KEY UPDATE va REPLACE.
Ushbu bo‘lim mundarijasi
- Asosiy sintaksis
- Bir nechta qator birdan
- Ustunlarni ko'rsatmaslik
- Standart qiymatlar
- NULL qo'shish
- Qo'shilgan qatorning id sini olish
- INSERT ... SELECT
- Takrorlanish bilan ishlash
- INSERT IGNORE - xatoni e'tiborsiz qoldirish
- ON DUPLICATE KEY UPDATE - bor bo'lsa yangilash
- REPLACE - o'chirib qayta qo'shish
- Fayldan ma'lumot yuklash
- Amaliy misol: to'liq ma'lumot to'plami
- Xulosa
Jadval tayyor - endi unga ma'lumot to'ldiramiz.
Asosiy sintaksis #
INSERT INTO jadval (ustun1, ustun2, ustun3)
VALUES (qiymat1, qiymat2, qiymat3);
INSERT INTO talabalar (ism, familiya, email, shahar)
VALUES ('Husanboy', 'Qodirov', '[email protected]', 'Namangan');
Query OK, 1 row affected (0.004 sec)
Bir nechta qator birdan #
INSERT INTO talabalar (ism, familiya, email, shahar, ortacha_baho) VALUES
('Sardor', 'Aliyev', '[email protected]', 'Toshkent', 3.80),
('Malika', 'Yusupova', '[email protected]', 'Buxoro', 4.90),
('Bekzod', 'Rasulov', '[email protected]', 'Toshkent', 3.20),
('Nodira', 'Sobirova', '[email protected]', 'Samarqand', 4.30);
Query OK, 4 rows affected (0.005 sec)
Records: 4 Duplicates: 0 Warnings: 0
-- Sekin: 1000 ta alohida so'rov
INSERT INTO talabalar (ism) VALUES ('A');
INSERT INTO talabalar (ism) VALUES ('B');
-- ...
-- Tez: bitta so'rov
INSERT INTO talabalar (ism) VALUES ('A'), ('B'), ('C'), ...;
Har bir so'rov server bilan aloqa talab qiladi. 1000 ta yozuvni bitta so'rovda qo'shish o'nlab barobar tezroq. Amalda 500-1000 tadan bo'lib yuborish optimal.
Ustunlarni ko'rsatmaslik #
-- Barcha ustunlar tartib bo'yicha (tavsiya etilmaydi)
INSERT INTO talabalar
VALUES (NULL, 1, 'Aziza', 'Tosheva', '[email protected]',
NULL, NULL, 'Xiva', 4.10, TRUE, NOW(), NOW());
Ustunlarsiz yozuv qisqa, lekin xavfli:
- Jadval tuzilmasi o'zgarsa (yangi ustun qo'shilsa), so'rov buziladi
- Kodni o'qiganda qaysi qiymat qaysi ustunga tegishli ekani noaniq
- Tartibni adashtirish oson
Har doim INSERT INTO jadval (ustun1, ustun2) VALUES (...) shaklida yozing.
Standart qiymatlar #
Ustun ko'rsatilmasa, DEFAULT qiymati qo'yiladi:
CREATE TABLE buyurtmalar (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
mijoz VARCHAR(120) NOT NULL,
summa DECIMAL(12,2) NOT NULL,
holat ENUM('yangi','jarayonda','yetkazildi') DEFAULT 'yangi',
yaratilgan TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO buyurtmalar (mijoz, summa)
VALUES ('Husanboy Qodirov', 450000);
SELECT * FROM buyurtmalar;
+----+------------------+-----------+-------+---------------------+
| id | mijoz | summa | holat | yaratilgan |
+----+------------------+-----------+-------+---------------------+
| 1 | Husanboy Qodirov | 450000.00 | yangi | 2026-09-09 14:22:31 |
+----+------------------+-----------+-------+---------------------+
id, holat va yaratilgan avtomatik to'ldirildi.
NULL qo'shish #
-- Aniq NULL
INSERT INTO talabalar (ism, familiya, email, telefon)
VALUES ('Aziza', 'Tosheva', '[email protected]', NULL);
-- Ustunni tushirib qoldirish - agar DEFAULT yoki NULL ruxsat etilgan bo'lsa
INSERT INTO talabalar (ism, familiya, email)
VALUES ('Aziza', 'Tosheva', '[email protected]');
NOT NULL ustunni tushirib qoldirib bo'lmaydiINSERT INTO talabalar (ism) VALUES ('Aziza');
ERROR 1364 (HY000): Field 'familiya' doesn't have a default value
NOT NULL va DEFAULT siz ustunga qiymat berish majburiy.
Qo'shilgan qatorning id sini olish #
INSERT INTO talabalar (ism, familiya, email)
VALUES ('Jasur', 'Xolmatov', '[email protected]');
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 7 |
+------------------+
Ko'pincha bog'liq yozuvlarni ketma-ket qo'shasiz:
INSERT INTO mijozlar (ism) VALUES ('Husanboy');
SET @mijoz_id = LAST_INSERT_ID();
INSERT INTO buyurtmalar (mijoz_id, summa) VALUES (@mijoz_id, 450000);
PHP da bu $pdo->lastInsertId() orqali olinadi.
INSERT ... SELECT #
Boshqa jadvaldan ma'lumot ko'chirish:
-- Arxiv jadvaliga ko'chirish
INSERT INTO talabalar_arxiv (ism, familiya, email, shahar)
SELECT ism, familiya, email, shahar
FROM talabalar
WHERE faolmi = FALSE;
-- Boshqa jadvalga guruhlangan ma'lumot
INSERT INTO shahar_statistikasi (shahar, talabalar_soni, ortacha_baho)
SELECT shahar, COUNT(*), AVG(ortacha_baho)
FROM talabalar
GROUP BY shahar;
Takrorlanish bilan ishlash #
Email UNIQUE bo'lsa va mavjud email qo'shmoqchi bo'lsangiz:
INSERT INTO talabalar (ism, familiya, email)
VALUES ('Yangi', 'Talaba', '[email protected]');
ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'uq_email'
INSERT IGNORE - xatoni e'tiborsiz qoldirish #
INSERT IGNORE INTO talabalar (ism, familiya, email)
VALUES ('Yangi', 'Talaba', '[email protected]');
Query OK, 0 rows affected, 1 warning (0.001 sec)
Xato bermaydi, lekin qator ham qo'shilmaydi.
INSERT IGNORE barcha xatolarni yashiradiU faqat takrorlanishni emas, boshqa xatolarni ham e'tiborsiz qoldiradi:
noto'g'ri tur, uzun matn, NOT NULL buzilishi. Natijada ma'lumot jimgina
buzilishi mumkin.
Aniq maqsad bo'lmasa, undan qoching.
ON DUPLICATE KEY UPDATE - bor bo'lsa yangilash #
Bu ancha foydali. "Qo'sh yoki yangila" (upsert) mantiqi:
INSERT INTO shahar_statistikasi (shahar, talabalar_soni)
VALUES ('Toshkent', 1)
ON DUPLICATE KEY UPDATE
talabalar_soni = talabalar_soni + 1;
Amaliy misol - sahifa ko'rishlarini sanash:
CREATE TABLE kunlik_statistika (
sana DATE PRIMARY KEY,
korishlar INT UNSIGNED NOT NULL DEFAULT 0
);
-- Har bir tashrifda:
INSERT INTO kunlik_statistika (sana, korishlar)
VALUES (CURDATE(), 1)
ON DUPLICATE KEY UPDATE korishlar = korishlar + 1;
Birinchi marta yangi qator yaratiladi, keyingi safar mavjud qator yangilanadi.
-- Yangi qiymatga murojaat qilish
INSERT INTO mahsulotlar (kod, nomi, narx)
VALUES ('KL-100', 'Klaviatura', 185000)
ON DUPLICATE KEY UPDATE
nomi = VALUES(nomi),
narx = VALUES(narx);
VALUES(ustun) nima?ON DUPLICATE KEY UPDATE ichida VALUES(narx) - bu qo'shmoqchi bo'lgan
yangi qiymat. Ya'ni "mavjud yozuvni yangi kelgan ma'lumot bilan yangila".
MySQL 8.0.20 dan boshlab yangi sintaksis ham bor:
INSERT INTO mahsulotlar (kod, narx) VALUES ('KL-100', 185000) AS yangi
ON DUPLICATE KEY UPDATE narx = yangi.narx;
REPLACE - o'chirib qayta qo'shish #
REPLACE INTO mahsulotlar (kod, nomi, narx)
VALUES ('KL-100', 'Klaviatura Pro', 210000);
REPLACE xavfliU mavjud qatorni o'chirib, yangisini qo'shadi. Natijada:
ido'zgaradi (AUTO_INCREMENTyangi qiymat beradi)- Bog'liq yozuvlar
ON DELETE CASCADEtufayli o'chib ketishi mumkin - Ko'rsatilmagan ustunlar standart qiymatga qaytadi
Deyarli har doim ON DUPLICATE KEY UPDATE afzalroq.
Fayldan ma'lumot yuklash #
Katta hajmdagi ma'lumot uchun eng tez usul:
LOAD DATA INFILE 'D:/malumot/talabalar.csv'
INTO TABLE talabalar
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(ism, familiya, email, shahar);
100 000 ta qator uchun:
| Usul | Vaqt |
|---|---|
Alohida INSERT lar | ~180 soniya |
Ko'p qatorli INSERT | ~8 soniya |
LOAD DATA INFILE | ~2 soniya |
Katta ma'lumot import qilayotganda bu farq juda muhim.
Amaliy misol: to'liq ma'lumot to'plami #
USE maktab;
INSERT INTO guruhlar (nomi, yil) VALUES
('IT-101', 2026),
('IT-102', 2026),
('IT-201', 2025),
('DIZ-101', 2026);
INSERT INTO talabalar
(guruh_id, ism, familiya, email, telefon, tugilgan_sana, shahar, ortacha_baho)
VALUES
(1, 'Husanboy', 'Qodirov', '[email protected]', '+998901234567', '2001-05-15', 'Namangan', 4.60),
(1, 'Sardor', 'Aliyev', '[email protected]', '+998911234567', '2001-08-22', 'Toshkent', 3.80),
(1, 'Aziza', 'Tosheva', '[email protected]', NULL, '2003-11-03', 'Xiva', 4.10),
(2, 'Malika', 'Yusupova', '[email protected]', '+998935678901', '2005-01-30', 'Buxoro', 4.90),
(2, 'Bekzod', 'Rasulov', '[email protected]', '+998946789012', '2003-07-12', 'Toshkent', 3.20),
(3, 'Nodira', 'Sobirova', '[email protected]', '+998957890123', '2002-03-25', 'Samarqand', 4.30),
(3, 'Jasur', 'Xolmatov', '[email protected]', NULL, '2004-09-08', 'Andijon', 3.50),
(4, 'Kamola', 'Ergasheva','[email protected]', '+998978901234', '2005-12-01', 'Samarqand', 4.75);
SELECT COUNT(*) AS jami_talabalar FROM talabalar;
+----------------+
| jami_talabalar |
+----------------+
| 8 |
+----------------+
kutubxona bazangizda ishlang:
mualliflarjadvaliga 5 ta muallif qo'shing (bittaINSERTbilan).kitoblarjadvaliga 10 ta kitob qo'shing,muallif_idni to'g'ri bog'lang.- Ba'zi kitoblarda
narxniNULLqoldiring. LAST_INSERT_ID()bilan oxirgi qo'shilgan kitobidsini oling.ON DUPLICATE KEY UPDATEbilan "qo'sh yoki narxni yangila" so'rovini yozing (kitoblargaisbn VARCHAR(20) UNIQUEustunini qo'shishingiz kerak bo'ladi).INSERT ... SELECTbilan 2000-yildan oldingi kitoblarnieski_kitoblarjadvaliga ko'chiring.
Xulosa #
INSERT INTO jadval (ustunlar) VALUES (qiymatlar);- asosiy shakl.- Ustunlarni har doim ko'rsating - tuzilma o'zgarganda so'rov buzilmaydi.
- Ko'p qatorni bitta so'rovda qo'shish o'nlab barobar tezroq.
LAST_INSERT_ID()yangi qo'shilgan qatorningidsini qaytaradi.ON DUPLICATE KEY UPDATE- "qo'sh yoki yangila" mantiqi uchun to'g'ri vosita.INSERT IGNOREvaREPLACEdan ehtiyot bo'ling - ular xatolarni yashiradi yoki ma'lumotni yo'qotadi.- Katta hajm uchun
LOAD DATA INFILEeng tez usul.
Keyingi bo'limda eng ko'p ishlatiladigan buyruq - SELECT ni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.