-
ที่จริงแล้ววิธีการลบข้อมูลในฐานข้อมูลนั้นไม่ซับซ้อน เหตุใดฉันจึงต้องกังวลกับมัน ประการแรก สิ่งที่ฉันแนะนำในที่นี้คือการลบข้อมูลทั้งหมดในฐานข้อมูล เนื่องจากข้อมูลอาจก่อให้เกิดข้อจำกัดร่วมกัน การดำเนินการลบจึงอาจเกิดขึ้นได้ ตกอยู่ในวงวนอันไม่มีที่สิ้นสุด ที่จริงแล้ววิธีการลบข้อมูลในฐานข้อมูลนั้นไม่ซับซ้อน เหตุใดฉันจึงต้องกังวลกับมัน ก่อนอื่นสิ่งที่ฉันแนะนำคือการลบข้อมูลทั้งหมดในฐานข้อมูลเนื่องจากข้อมูลอาจก่อให้เกิดข้อจำกัดร่วมกัน อาจตกอยู่ในวงวนไม่สิ้นสุด ประการที่สอง ใช้ขั้นตอนการจัดเก็บsp_MSForEachTableอย่างไม่เป็นทางการของ Microsoft ที่นี่
ผู้อ่านและเพื่อน ๆ หลายคนอาจเคยประสบปัญหาประเภทนี้: พวกเขาต้องการล้างฐานข้อมูลว่างตามฐานข้อมูลการพัฒนา แต่เนื่องจากขาดความเข้าใจโดยรวมเกี่ยวกับโครงสร้างฐานข้อมูล เมื่อทำการลบบันทึกในตาราง พวกเขาจึงไม่สามารถลบออกได้ เนื่องจากอาจมีข้อจำกัดของคีย์ภายนอก โครงสร้างฐานข้อมูลทั่วไปคือตารางหลักและตารางย่อย ในกรณีนี้ โดยทั่วไปคุณจะต้องลบเรกคอร์ดตารางย่อยก่อน แล้วจึงลบเรกคอร์ดตารางหลัก
เมื่อพูดถึงการลบบันทึกข้อมูล คำสั่งลบและตัดทอนมักจะนึกถึง อย่างไรก็ตาม หากมีข้อจำกัดระหว่างสองตารางขึ้นไป คำสั่งทั้งสองนี้อาจล้มเหลว และสิ่งเลวร้ายที่สุดคือเพียงสองคำสั่งนี้เท่านั้นที่คุณดำเนินการได้ ครั้งละหนึ่งโต๊ะ ดังนั้นคุณควรทำอย่างไรเมื่อคุณต้องการลบระเบียนทั้งหมดในฐานข้อมูล SQL Server มีสองตัวเลือก:
1. ลบทีละตาราง วิธีนี้ไม่สมจริงมากเมื่อมีตารางจำนวนมาก แม้ว่าจะมีตารางไม่มากแต่มีข้อจำกัดมากมาย แต่คุณก็ยังต้องใช้เวลาและพลังงานมากในการศึกษาข้อจำกัด จากนั้นค้นหาว่าตารางใดที่จะลบก่อน ตารางใดที่จะลบต่อไป และตารางใดที่จะลบครั้งสุดท้าย
2. ปิดการใช้งานข้อจำกัดทั้งหมด ลบข้อมูลทั้งหมด และสุดท้าย เปิดใช้งานข้อจำกัด ด้วยวิธีนี้ คุณจะไม่ต้องเสียเวลาและพลังงานในการศึกษาข้อจำกัด คุณเพียงแต่เขียนขั้นตอนการจัดเก็บอย่างง่าย ๆ เพื่อทำให้งานนี้เสร็จสมบูรณ์โดยอัตโนมัติ
จากสองตัวเลือกนี้จะเห็นได้ไม่ยากว่าตัวเลือกที่สองนั้นง่ายและมีประสิทธิภาพมากที่สุด แล้วเมื่อใช้ตัวเลือกที่สองจะนำไปใช้อย่างไร?
ขั้นแรก คุณต้องเขียนโค้ดเพื่อวนซ้ำตารางทั้งหมด ที่นี่ฉันขอแนะนำขั้นตอนการจัดเก็บ sp_MSForEachTable เนื่องจากไม่มีคำอธิบายของขั้นตอนการจัดเก็บนี้ในเอกสารอย่างเป็นทางการของ Microsoft และนักพัฒนาจำนวนมากอาจไม่เคยได้ยินเรื่องนี้ ดังนั้นคุณจึงสามารถค้นหาได้ บนอินเทอร์เน็ต วิธีแก้ปัญหาส่วนใหญ่มีความซับซ้อนมาก บางคนอาจคิดว่าเนื่องจากไม่มีเอกสารอย่างเป็นทางการ กระบวนการจัดเก็บข้อมูลนี้อาจไม่เสถียร และพวกเขาจะปฏิเสธในทางจิตวิทยา แต่ก็ไม่เป็นเช่นนั้น มาดูสคริปต์แบบเต็มกัน:
สร้างขั้นตอน sp_DeleteAllData
เช่น
EXEC sp_MSForEachTable 'แก้ไขตารางหรือไม่ ไม่ตรวจสอบข้อจำกัดทั้งหมด'
EXEC sp_MSForEachTable 'แก้ไขตารางหรือไม่ ปิดการใช้งานทริกเกอร์ทั้งหมด'
EXEC sp_MSForEachTable 'ลบจาก ?'
EXEC sp_MSForEachTable 'แก้ไขตารางหรือไม่ ตรวจสอบข้อจำกัดทั้งหมด'
EXEC sp_MSForEachTable 'แก้ไขตารางหรือไม่ เปิดใช้งานทริกเกอร์ทั้งหมด'
EXEC sp_MSFOREACHTABLE 'เลือก * จาก?'
ไป
สคริปต์นี้สร้างขั้นตอนการจัดเก็บชื่อ sp_DeleteAllData คำสั่งสองรายการแรกปิดใช้งานข้อจำกัดและทริกเกอร์ตามลำดับ คำสั่งต่อไปนี้จะคืนค่าข้อจำกัดและทริกเกอร์ตามลำดับ คำสั่งสุดท้ายจะแสดงระเบียนในแต่ละตาราง คำสั่งนี้สามารถละเว้นได้ ฉันแค่ต้องการยืนยันว่าตารางทั้งหมดถูกล้างแล้วหรือไม่
คุณสามารถเรียกใช้ขั้นตอนที่เก็บไว้นี้บนฐานข้อมูลใดก็ได้ แน่นอนว่าไม่ใช่ในฐานข้อมูลที่สร้างขึ้น แต่อย่าโทษฉันที่ไม่บอกคุณ! อย่างไรก็ตาม ให้สำรองฐานข้อมูลก่อน ใช้ฐานข้อมูลสำรองเพื่อกู้คืน จากนั้นจึงเรียกใช้ขั้นตอนที่เก็บไว้ 555 ถึงแม้จะเป็นฐานข้อมูลขนาดใหญ่ก็ตาม ก็ใช้เวลาไม่นานฐานข้อมูลก็จะกลายเป็นฐานข้อมูลเปล่าๆ ซึ่งก็น่ากลัวนิดหน่อย!