MySQLi - การจัดการรายการที่ซ้ำกัน
ตารางหรือชุดผลลัพธ์บางครั้งอาจมีระเบียนที่ซ้ำกัน บางครั้งอาจได้รับอนุญาต แต่บางครั้งก็จำเป็นต้องหยุดบันทึกที่ซ้ำกัน บางครั้งจำเป็นต้องระบุระเบียนที่ซ้ำกันและลบออกจากตาราง บทนี้จะอธิบายถึงวิธีการป้องกันไม่ให้ระเบียนที่ซ้ำกันเกิดขึ้นในตารางและวิธีลบระเบียนที่ซ้ำกันที่มีอยู่แล้ว
การป้องกันไม่ให้รายการที่ซ้ำกันเกิดขึ้นในตาราง
คุณสามารถใช้ไฟล์ PRIMARY KEY หรือ UNIQUEจัดทำดัชนีบนตารางที่มีเขตข้อมูลที่เหมาะสมเพื่อหยุดการบันทึกซ้ำ ลองดูตัวอย่าง: ตารางต่อไปนี้ไม่มีดัชนีหรือคีย์หลักดังกล่าวดังนั้นจึงอนุญาตให้มีระเบียนที่ซ้ำกันสำหรับ first_name และ last_name
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
ในการป้องกันไม่ให้มีการสร้างระเบียนหลายระเบียนที่มีค่าชื่อและนามสกุลเดียวกันในตารางนี้ให้เพิ่ม PRIMARY KEY ลงในคำจำกัดความ เมื่อคุณทำเช่นนี้คุณจำเป็นต้องประกาศคอลัมน์ที่จัดทำดัชนีแล้วว่าไม่เป็นโมฆะด้วยเนื่องจากคีย์หลักไม่อนุญาตให้ใช้ค่า NULL -
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)
);
การมีดัชนีที่ไม่ซ้ำกันในตารางโดยปกติจะทำให้เกิดข้อผิดพลาดหากคุณแทรกระเบียนลงในตารางที่ซ้ำกับระเบียนที่มีอยู่ในคอลัมน์หรือคอลัมน์ที่กำหนดดัชนี
ใช้ INSERT IGNORE ค่อนข้างมากกว่า INSERT. หากระเบียนไม่ซ้ำกับระเบียนที่มีอยู่ MySQLi จะแทรกตามปกติ หากเร็กคอร์ดซ้ำกันคีย์เวิร์ด IGNORE จะบอกให้ MySQLi ทิ้งโดยไม่ทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้ไม่มีข้อผิดพลาดและในเวลาเดียวกันจะไม่แทรกระเบียนที่ซ้ำกัน
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)
ใช้ REPLACEมากกว่า INSERT หากเร็กคอร์ดใหม่จะถูกแทรกเช่นเดียวกับ INSERT หากเป็นรายการที่ซ้ำกันระเบียนใหม่จะแทนที่ระเบียนเก่า -
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
ควรเลือก INSERT IGNORE และ REPLACE ตามพฤติกรรมการจัดการซ้ำที่คุณต้องการให้เกิดผล INSERT IGNORE เก็บชุดแรกของระเบียนที่ซ้ำกันและทิ้งส่วนที่เหลือ REPLACE จะเก็บชุดสุดท้ายของรายการที่ซ้ำกันและลบรายการก่อนหน้านี้ออก
อีกวิธีหนึ่งในการบังคับใช้ความเป็นเอกลักษณ์คือการเพิ่มดัชนี UNIQUE แทนที่จะเป็นคีย์หลักลงในตาราง
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
การนับและการระบุรายการที่ซ้ำกัน
ต่อไปนี้เป็นแบบสอบถามเพื่อนับระเบียนที่ซ้ำกันด้วย first_name และ last_name ในตาราง
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
แบบสอบถามนี้จะแสดงรายการของระเบียนที่ซ้ำกันทั้งหมดในตาราง person_tbl โดยทั่วไปในการระบุชุดของค่าที่ซ้ำกันให้ทำดังต่อไปนี้ -
พิจารณาว่าคอลัมน์ใดมีค่าที่อาจซ้ำกันได้
แสดงรายการคอลัมน์เหล่านั้นในรายการการเลือกคอลัมน์พร้อมกับ COUNT (*)
แสดงรายการคอลัมน์ใน GROUP BY clause ด้วย
เพิ่มส่วนคำสั่ง HAVING ที่กำจัดค่าที่ไม่ซ้ำกันโดยกำหนดให้การนับกลุ่มมากกว่าหนึ่ง
การกำจัดรายการที่ซ้ำกันจากผลการค้นหา:
คุณสามารถใช้ได้ DISTINCT พร้อมกับคำสั่ง SELECT เพื่อค้นหาระเบียนเฉพาะที่มีอยู่ในตาราง
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
อีกทางเลือกหนึ่งสำหรับ DISTINCT คือการเพิ่ม GROUP BY clause ที่ตั้งชื่อคอลัมน์ที่คุณเลือก สิ่งนี้มีผลในการลบรายการที่ซ้ำกันและเลือกเฉพาะชุดค่าผสมที่ไม่ซ้ำกันในคอลัมน์ที่ระบุ -
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
การลบรายการที่ซ้ำกันโดยใช้การเปลี่ยนตาราง
หากคุณมีระเบียนที่ซ้ำกันในตารางและคุณต้องการลบระเบียนที่ซ้ำกันทั้งหมดออกจากตารางนั้นนี่คือขั้นตอน -
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
วิธีง่ายๆในการลบระเบียนที่ซ้ำกันออกจากตารางคือเพิ่ม INDEX หรือ PRIMAY KEY ลงในตารางนั้น แม้ว่าตารางนี้จะมีอยู่แล้ว แต่คุณสามารถใช้เทคนิคนี้เพื่อลบระเบียนที่ซ้ำกันและคุณจะปลอดภัยในอนาคตเช่นกัน
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);