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.

🕑 15 daqiqa o‘qish 📄 555 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Asosiy sintaksis
  2. Bir nechta qator birdan
  3. Ustunlarni ko'rsatmaslik
  4. Standart qiymatlar
  5. NULL qo'shish
  6. Qo'shilgan qatorning id sini olish
  7. INSERT ... SELECT
  8. Takrorlanish bilan ishlash
  9. INSERT IGNORE - xatoni e'tiborsiz qoldirish
  10. ON DUPLICATE KEY UPDATE - bor bo'lsa yangilash
  11. REPLACE - o'chirib qayta qo'shish
  12. Fayldan ma'lumot yuklash
  13. Amaliy misol: to'liq ma'lumot to'plami
  14. Xulosa

Jadval tayyor - endi unga ma'lumot to'ldiramiz.

Asosiy sintaksis #

SQL
INSERT INTO jadval (ustun1, ustun2, ustun3)
VALUES (qiymat1, qiymat2, qiymat3);
SQL
INSERT INTO talabalar (ism, familiya, email, shahar)
VALUES ('Husanboy', 'Qodirov', '[email protected]', 'Namangan');
Natija
Query OK, 1 row affected (0.004 sec)

Bir nechta qator birdan #

SQL
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);
Natija
Query OK, 4 rows affected (0.005 sec)
Records: 4  Duplicates: 0  Warnings: 0
Ko'p qatorni birga qo'shing
SQL
-- 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 #

SQL
-- 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());
Ustunlarni har doim ko'rsating

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:

SQL
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;
Natija
+----+------------------+-----------+-------+---------------------+
| 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 #

SQL
-- 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'lmaydi
SQL
INSERT INTO talabalar (ism) VALUES ('Aziza');
Natija
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 #

SQL
INSERT INTO talabalar (ism, familiya, email)
VALUES ('Jasur', 'Xolmatov', '[email protected]');

SELECT LAST_INSERT_ID();
Natija
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                7 |
+------------------+
Bu nima uchun kerak?

Ko'pincha bog'liq yozuvlarni ketma-ket qo'shasiz:

SQL
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:

SQL
-- 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:

SQL
INSERT INTO talabalar (ism, familiya, email)
VALUES ('Yangi', 'Talaba', '[email protected]');
Natija
ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'uq_email'

INSERT IGNORE - xatoni e'tiborsiz qoldirish #

SQL
INSERT IGNORE INTO talabalar (ism, familiya, email)
VALUES ('Yangi', 'Talaba', '[email protected]');
Natija
Query OK, 0 rows affected, 1 warning (0.001 sec)

Xato bermaydi, lekin qator ham qo'shilmaydi.

INSERT IGNORE barcha xatolarni yashiradi

U 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:

SQL
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:

SQL
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.

SQL
-- 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:

SQL
INSERT INTO mahsulotlar (kod, narx) VALUES ('KL-100', 185000) AS yangi
ON DUPLICATE KEY UPDATE narx = yangi.narx;

REPLACE - o'chirib qayta qo'shish #

SQL
REPLACE INTO mahsulotlar (kod, nomi, narx)
VALUES ('KL-100', 'Klaviatura Pro', 210000);
REPLACE xavfli

U mavjud qatorni o'chirib, yangisini qo'shadi. Natijada:

  • id o'zgaradi (AUTO_INCREMENT yangi qiymat beradi)
  • Bog'liq yozuvlar ON DELETE CASCADE tufayli 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:

SQL
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);
Tezlik farqi

100 000 ta qator uchun:

UsulVaqt
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 #

SQL
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;
Natija
+----------------+
| jami_talabalar |
+----------------+
|              8 |
+----------------+
Amaliy topshiriq

kutubxona bazangizda ishlang:

  1. mualliflar jadvaliga 5 ta muallif qo'shing (bitta INSERT bilan).
  2. kitoblar jadvaliga 10 ta kitob qo'shing, muallif_id ni to'g'ri bog'lang.
  3. Ba'zi kitoblarda narx ni NULL qoldiring.
  4. LAST_INSERT_ID() bilan oxirgi qo'shilgan kitob id sini oling.
  5. ON DUPLICATE KEY UPDATE bilan "qo'sh yoki narxni yangila" so'rovini yozing (kitoblar ga isbn VARCHAR(20) UNIQUE ustunini qo'shishingiz kerak bo'ladi).
  6. INSERT ... SELECT bilan 2000-yildan oldingi kitoblarni eski_kitoblar jadvaliga 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 qatorning id sini qaytaradi.
  • ON DUPLICATE KEY UPDATE - "qo'sh yoki yangila" mantiqi uchun to'g'ri vosita.
  • INSERT IGNORE va REPLACE dan ehtiyot bo'ling - ular xatolarni yashiradi yoki ma'lumotni yo'qotadi.
  • Katta hajm uchun LOAD DATA INFILE eng tez usul.

Keyingi bo'limda eng ko'p ishlatiladigan buyruq - SELECT ni o'rganamiz.

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.