MariaDB - การจัดการรายการที่ซ้ำกัน

MariaDB ตามที่กล่าวไว้ในบทเรียนก่อนหน้านี้อนุญาตให้ทำระเบียนและตารางซ้ำกันได้ในบางสถานการณ์ รายการที่ซ้ำกันเหล่านี้บางรายการไม่ได้ซ้ำกันเนื่องจากข้อมูลหรือประเภทออบเจ็กต์ที่แตกต่างกันหรือเป็นผลมาจากอายุการใช้งานที่ไม่ซ้ำกันหรือการจัดเก็บอ็อบเจ็กต์การดำเนินการ รายการที่ซ้ำกันเหล่านี้มักจะไม่มีปัญหา

ในบางสถานการณ์รายการที่ซ้ำกันอาจทำให้เกิดปัญหาและมักปรากฏขึ้นเนื่องจากการกระทำโดยปริยายหรือนโยบายผ่อนปรนของคำสั่ง MariaDB มีหลายวิธีในการควบคุมปัญหานี้ค้นหารายการที่ซ้ำกันลบรายการที่ซ้ำกันและป้องกันการสร้างซ้ำ

กลยุทธ์และเครื่องมือ

มีสี่วิธีหลักในการจัดการรายการที่ซ้ำกัน -

  • ตกปลาด้วย JOIN และลบด้วยตารางชั่วคราว

  • ใช้ INSERT ... ON DUPLICATE KEY UPDATE เพื่ออัปเดตเกี่ยวกับการค้นพบรายการที่ซ้ำกัน

  • ใช้ DISTINCT เพื่อตัดผลลัพธ์ของคำสั่ง SELECT และลบรายการที่ซ้ำกัน

  • ใช้ INSERT IGNORE เพื่อหยุดการแทรกข้อมูลที่ซ้ำกัน

ใช้เข้าร่วมกับตารางชั่วคราว

เพียงแค่ดำเนินการกึ่งเข้าร่วมเช่นการรวมภายในจากนั้นลบรายการที่ซ้ำกันที่พบในตารางชั่วคราว

การใช้ INSERT

เมื่อ INSERT ... ON DUPLICATE KEY UPDATE พบว่ามีคีย์เฉพาะหรือคีย์หลักที่ซ้ำกันระบบจะทำการอัปเดต ในการค้นพบคีย์ที่ไม่ซ้ำกันหลายคีย์จะอัปเดตเฉพาะคีย์แรกเท่านั้น ดังนั้นอย่าใช้บนตารางที่มีดัชนีเฉพาะหลายตัว

ตรวจสอบตัวอย่างต่อไปนี้ซึ่งแสดงให้เห็นสิ่งที่เกิดขึ้นในตารางที่มีค่าที่จัดทำดัชนีเมื่อแทรกลงในฟิลด์ที่มีการเติมข้อมูล -

INSERT INTO add_dupl VALUES (1,'Apple');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

Note - หากไม่พบคีย์คำสั่ง INSERT ... ON DUPLICATE KEY UPDATE จะทำงานเหมือนกับคำสั่งแทรกปกติ

ใช้ DISTINCT

คำสั่ง DISTINCT ลบรายการที่ซ้ำกันออกจากผลลัพธ์ ไวยากรณ์ทั่วไปสำหรับอนุประโยค DISTINCT มีดังนี้ -

SELECT DISTINCT fields
FROM table
[WHERE conditions];

Note - ผลลัพธ์ของคำสั่งที่มีอนุประโยค DISTINCT -

  • เมื่อใช้นิพจน์เดียวจะส่งคืนค่าที่ไม่ซ้ำกันสำหรับมัน

  • เมื่อใช้หลายนิพจน์จะส่งกลับชุดค่าผสมที่ไม่ซ้ำกัน

  • ไม่ละเว้นค่า NULL; ดังนั้นผลลัพธ์ยังมี NULL เป็นค่าเฉพาะ

ตรวจสอบคำสั่งต่อไปนี้โดยใช้ประโยค DISTINCT สำหรับนิพจน์เดียว -

SELECT DISTINCT product_id
FROM products
WHERE product_name = 'DustBlaster 5000';

ตรวจสอบตัวอย่างต่อไปนี้โดยใช้หลายนิพจน์ -

SELECT DISTINCT product_name, product_id
FROM products
WHERE product_id < 30

ใช้ INSERT IGNORE

คำสั่ง INSERT IGNORE สั่งให้ MariaDB ยกเลิกการแทรกในการค้นพบเรกคอร์ดที่ซ้ำกัน ตรวจสอบตัวอย่างการใช้งานด้านล่าง -

mysql> INSERT IGNORE INTO customer_tbl (LN, FN)
   VALUES( 'Lex', 'Luther');

นอกจากนี้โปรดสังเกตตรรกะเบื้องหลังรายการที่ซ้ำกัน บางตารางต้องการข้อมูลซ้ำตามลักษณะของข้อมูลตารางนั้น รองรับความต้องการดังกล่าวในกลยุทธ์ของคุณในการจัดการระเบียนที่ซ้ำกัน