ความแตกต่างของ DML เทียบกับ DDL นั้นไม่ชัดเจนเหมือนชื่อของพวกเขาดังนั้นบางครั้งบางสิ่งก็สกปรก
Oracle จัดประเภทTRUNCATEอย่างชัดเจนว่าเป็น DDLในแนวทางแนวคิด แต่DELETEเป็น DML
ประเด็นหลักที่วางTRUNCATEในค่าย DDL บน Oracle ตามที่ฉันเข้าใจคือ:
TRUNCATEสามารถเปลี่ยนพารามิเตอร์หน่วยเก็บข้อมูล ( NEXTพารามิเตอร์) และสิ่งเหล่านั้นเป็นส่วนหนึ่งของคำนิยามของวัตถุ - ที่อยู่ในค่าย DDL
TRUNCATEโดยนัยcommitและไม่สามารถย้อนกลับ (ย้อนหลัง) - การดำเนินการ DDL ส่วนใหญ่ (ทั้งหมด?) ใน Oracle ทำสิ่งนี้ไม่มี DML ทำ
ความจริงที่TRUNCATEไม่ได้เรียกใช้ON DELETEทริกเกอร์ยังตั้งค่านอกเหนือจากการดำเนินงาน DML ปกติ (แต่การดำเนินการโดยตรงบางเส้นทาง DML ยังข้ามตัวเรียกดังนั้นนั่นไม่ใช่ตัวบ่งชี้ที่ชัดเจน)
บันทึกย่อเอกสารเดียวกันนั้นที่DELETEสร้าง UNDO แต่TRUNCATEไม่ทำดังนั้นคำสั่งของคุณจึงถูกต้องในส่วนนี้ (โปรดทราบว่าTRUNCATEจะสร้างบางส่วนREDOเพื่อให้สามารถตัดทอนซ้ำในกรณีที่กู้คืน / กู้คืน) แต่NOLOGGINGการดำเนินการบางอย่างสามารถลด UNDO ที่ลดลง (ไม่แน่ใจว่าไม่มีเลย) ดังนั้นนั่นไม่ใช่ตัวบ่งชี้ที่ชัดเจนในความคิดของฉัน
ดังนั้นฉันจะสรุปเป็น:
truncateไม่ใช่ "การทำธุรกรรม" ในแง่ที่ยอมรับและไม่สามารถย้อนกลับได้และสามารถปรับเปลี่ยนแอตทริบิวต์ที่เก็บข้อมูลวัตถุ ดังนั้นจึงไม่ใช่ DML ทั่วไป - Oracle จัดประเภทเป็น DDL
delete เป็นคำสั่ง DML สามัญ