วิธีการลบ data

วิธีการลบ data ที่ซ้ำซ้อนในฐานข้อมูล

สำหรับ นักพัฒนาโปรแกรมด้านฐานข้อมูลหรือ sql developer หากว่ามีมีการกำหนดค่า constraint (unique constraint หรือที่เรียกว่า primary key และ foreign key) ที่เหมาะสม อาจทำให้เกิดการซ้ำซ้อนกันของข้อมูลได้ 

แต่เมื่อเกิดความผิดพลาดที่ข้อมูลซ้ำซ้อนกัน แล้วเราก็สามารถเลือกลบข้อมูลที่มีการ insert เข้าไปในภายหลังได้ (ข้อมูลที่ insert ก่อนเราจะ assume ว่ามีความถูกต้องมากกว่า) 

ยกตัวอย่างเช่น ในข้อมูลของ table person ซึ่งเป็น table master เมื่อมีการสร้าง table นี้แล้ว แต่ยังไม่ได้กำหนด primary key ทำให้เมื่อ insert data เข้าไปแล้ว เกิดค่าใน ฟิลด์ citizen_id ซ้ำกัน อย่างนี้เราก็ถือว่าเป็นความผิดพลาดด้าน business ถึงแม้ว่า จะไม่ผิดหลักด้านการ insert data ก็ตาม

แต่ก่อนที่เราจะลบเรคอร์ดที่มาทีหลังออกไป เราควรรู้จักกับ rowid ก่อนในส่วนของ database oracle คำว่า rowid เปรียบเสมือน row ที่เป็นเลขจำเพาะเจาะจงของเรคอร์ดนั้น (เสมือนเป็นฟิลด์เสมือนนั่นเอง) 

เราสามารถหา rowid ได้ทุก table เช่น ใช้คำสั่ง select rowid, name from person ซึ่งในที่นี้หมายความว่าเราไม่ได้สร้างฟิลด์ที่ชื่อ rowid ขึ้นมาเอง และถึงแม้ต้องการสร้างฟิลด์ชื่อนี้ ใน database oracle ก็ไม่อนุญาตให้ท่านสร้างเหมือนกัน 

ในที่นี้ยกตัวอย่างว่า table มีข้อมูลที่เป็นเลขบัตรประชาชน 4444 ซึ่งมีอยู่สองเรคอร์ด หากโปรแกรมเมอร์ใช้คำสั่ง delete from person where citizen_id = ‘444’ โปรแกรมจะทำการลบข้อมูลออกไปสองเรคอร์ดทำให้ต้องใช้คำสั่ง เพิ่มในการ insert data  เข้ามาภายหลังอีก 1 เรคอร์ด

เพื่อเป็นการทุ่นเวลาและต้องการลบข้อมูลที่เข้ามาหลังสุดออกไปให้ใช้คำสั่งดังนี้คือ 

DELETE FROM person

WHERE rowid NOT IN

(SELECT MIN(rowid)

FROM   person

GROUP BY  citizen_id) ;

คำสั่งนี้ หมายความว่าโปรแกรมเมอร์ต้องการลบข้อมูลที่เข้ามาในภายหลังออกไป โดยการ กรุ๊ป ที่ citizen_id หากข้อมูลมีค่าฟิลด์ citizen_id ซ้ำกันมากกว่า 1 เรคอร์ดมันจะทำการลบ data ที่เข้ามาหลังสุดออกไป เก็บแต่เฉพาะ data ที่เข้าในครั้งแรกสุด 

ซึ่งเมื่อรันคำสั่งข้างต้นเสร็จสิ้น แล้วเรา query ออกมาดูจะพบว่า data ที่มี citizen_id มีค่า ‘4444’ จะเหลือเพียง 1 เรคอร์ดแล้ว ซึ่งนี้ก็เป็นหลักการลบข้อมูลที่ซ้ำซ้อนกัน โดยลบข้อมูลที่เข้ามาหลังสุดออกไป

แต่หากว่า ต้องการจะลบ data ที่เป็นเงื่อนไขอื่นเช่น citizen_id = ‘4444’ ที่มี name ชื่อ ‘JOHRN’ (ซึ่ง insert data เข้าไปผิด) ก็ต้องระบุชี้ชัดให้เจาะจงลงไปมากกว่านี้ โดยใช้คำสั่ง

Delete from person where citizen_id = ‘4444’ and name= ‘JOHRN’ ซึ่งข้อดีของฐานข้อมูล oracle หากว่าผู้ใช้งานยังไม่ได้สั่ง commit code data ก็ยังไม่เกิดการเปลี่ยนแปลงในทันที (การใช้คำสั่ง commit หรือ rollback เป็นการยืนยันว่า เราจะดำเนินการในสิ่งนั้นหรือไม่)

ต่างกับ database อื่น เช่น ibm netteza,ibm db2 ที่เมื่อรันคำสั่งไปแล้วจะถือเป็นการยืนยันทันที