MySQL so'rovi ikki nusxadagi ma'lumotlarni qanday ishlaydi?Ikki nusxadagi ma'lumotlar bayonotini olib tashlash uchun filtrlang

MySQLSo'rovlar ikki nusxadagi ma'lumotlarni qanday ko'rib chiqadi?Ikki nusxadagi ma'lumotlar bayonotini olib tashlash uchun filtrlang

MySQL Ikki nusxadagi ma'lumotlarni qayta ishlash

Ba'zi MySQL ma'lumotlar jadvallarida takroriy yozuvlar bo'lishi mumkin.Ba'zi hollarda biz takroriy ma'lumotlarning mavjudligiga ruxsat beramiz, lekin ba'zida biz ushbu takroriy ma'lumotlarni o'chirishimiz kerak.

Ushbu bobda biz ma'lumotlar jadvalidagi takroriy ma'lumotlarning oldini olish va ma'lumotlar jadvalidagi takroriy ma'lumotlarni qanday o'chirishni tanishtiramiz.


Jadvallardagi takroriy ma'lumotlarning oldini olish

MySQL ma'lumotlar jadvalida ko'rsatilgan maydonni shunday o'rnatishingiz mumkin ASOSIY KALT yoki UNIQUE (noyob) Ma'lumotlarning yagonaligini ta'minlash uchun indeks.

Keling, misol qilib ko'raylik: Quyidagi jadvalda indekslar va asosiy kalitlar yo'q, shuning uchun jadval bir nechta takroriy yozuvlarga ruxsat beradi.

CREATE TABLE person_tbl
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);

Jadvaldagi ism va familiya maydonlarini o'rnatmoqchi bo'lsangiz, ma'lumotlarni takrorlab bo'lmaydi, ma'lumotlarning yagonaligini o'rnatish uchun ikkilamchi asosiy kalit rejimini o'rnatishingiz mumkin.Agar siz ikkilamchi asosiy kalitni o'rnatsangiz, ushbu kalitning standart qiymati NULL bo'lishi mumkin emas, lekin NOT NULL ga o'rnatilishi mumkin.Quyidagicha:

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

Agar biz noyob indeksni o'rnatgan bo'lsak, u holda takroriy ma'lumotlarni kiritishda SQL bayonoti muvaffaqiyatli bajarilmaydi va xatoga yo'l qo'yadi.

INSERT IGNORE INTO va INSERT INTO o'rtasidagi farq shundaki, INSERT IGNORE ma'lumotlar bazasida mavjud bo'lgan ma'lumotlarni e'tiborsiz qoldiradi.Agar ma'lumotlar bazasida hech qanday ma'lumot bo'lmasa, u yangi ma'lumotlarni kiritadi, agar ma'lumot mavjud bo'lsa, u bu ma'lumotlarni o'tkazib yuboradi.Shunday qilib, ma'lumotlar bazasidagi mavjud ma'lumotlar saqlanib qolishi va bo'shliqqa ma'lumotlarni kiritish maqsadiga erishish mumkin.

Quyidagi misolda INSERT IGNORE INTO qo'llaniladi, u xatosiz ishlaydi va ma'lumotlar jadvaliga takroriy ma'lumotlarni kiritmaydi:

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)

INSERT IGNORE INTO Ma'lumotlarni kiritishda, yozuvning o'ziga xosligi o'rnatilgandan so'ng, takroriy ma'lumotlar kiritilsa, hech qanday xatolik qaytarilmaydi, faqat ogohlantirish qaytariladi.Va agar asosiy yoki noyob yozuv bo'lsa, avval uni o'chirib tashlang.Yangi rekord qo'ying.

Ma'lumotlaringizning o'ziga xosligini o'rnatishning yana bir usuli - UNIQUE indeksini qo'shish:

CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10)
   UNIQUE (last_name, first_name)
);

Statistik ma'lumotlar takrorlanadi

Quyida jadvaldagi ism va familiyaning takroriy yozuvlari sonini hisoblaymiz:

mysql> SELECT COUNT(*) as repetitions, last_name, first_name
    -> FROM person_tbl
    -> GROUP BY last_name, first_name
    -> HAVING repetitions > 1;

Yuqoridagi so'rov bayonoti person_tbl jadvalidagi takroriy yozuvlar sonini qaytaradi.Umuman olganda, takroriy qiymatlarni so'rash uchun quyidagilarni bajaring:

  • Qaysi ustunda mumkin bo'lgan takroriy qiymatlar mavjudligini aniqlang.
  • Ushbu ustunlarni ro'yxatga olish uchun ustun tanlash ro'yxatida COUNT(*) dan foydalaning.
  • GROUP BY bandida keltirilgan ustunlar.
  • HAVING bandi 1 dan ortiq takrorlash sonini belgilaydi.

takroriy ma'lumotlarni filtrlash

Agar noyob ma'lumotlarni o'qish kerak bo'lsa, takroriy ma'lumotlarni filtrlash uchun SELECT iborasidagi DISTINCT kalit so'zidan foydalanishingiz mumkin.

mysql> SELECT DISTINCT last_name, first_name
    -> FROM person_tbl;

Jadvaldagi noyob ma'lumotlarni o'qish uchun GROUP BY dan ham foydalanishingiz mumkin:

mysql> SELECT last_name, first_name
    -> FROM person_tbl
    -> GROUP BY (last_name, first_name);

ma'lumotlarni takrorlash

Agar siz ma'lumotlar jadvalidagi takroriy ma'lumotlarni o'chirmoqchi bo'lsangiz, quyidagi SQL bayonotidan foydalanishingiz mumkin:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
    ->                  FROM person_tbl;
    ->                  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

Albatta, jadvaldagi ikki nusxadagi yozuvlarni oʻchirish uchun maʼlumotlar jadvaliga INDEX (indeks) va PRIMAY KEY (asosiy kalit) ham qoʻshishingiz mumkin.Quyidagi usullar:

mysql> ALTER IGNORE TABLE person_tbl
    -> ADD PRIMARY KEY (last_name, first_name);

Umid qilamanki, Chen Veyliang blogi ( https://www.chenweiliang.com/ ) "MySQL ikki nusxadagi ma'lumotlarni qanday so'raydi va qayta ishlaydi?Filtrlash va nusxalash bayonotlari” sizga yordam beradi.

Ushbu maqolaning havolasini baham ko'rish uchun xush kelibsiz:https://www.chenweiliang.com/cwl-499.html

Eng so'nggi yangiliklardan xabardor bo'lish uchun Chen Veyliang blogining Telegram kanaliga xush kelibsiz!

🔔 Birinchi bo'lib kanalning yuqori katalogida qimmatli "ChatGPT Content Marketing AI vositasidan foydalanish bo'yicha qo'llanma"ni qo'lga kiriting! 🌟
📚 Ushbu qo'llanmada katta ahamiyatga ega, 🌟Bu kamdan-kam imkoniyat, uni qo'ldan boy bermang! ⏰⌛💨
Baham ko'ring va yoqsa like!
Sizning baham ko'rish va yoqtirishlaringiz bizning doimiy motivatsiyamizdir!

 

发表 评论

Sizning elektron pochta manzilingiz e'lon qilinmaydi. 必填 项 已 用 * Yorliq

tepaga aylantiring