ความแตกต่างของ 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 สามัญ