ความแตกต่างระหว่างTRUNCATE
และDELETE
ใน SQL คืออะไร?
หากคำตอบของคุณเฉพาะแพลตฟอร์มโปรดระบุว่า
ความแตกต่างระหว่างTRUNCATE
และDELETE
ใน SQL คืออะไร?
หากคำตอบของคุณเฉพาะแพลตฟอร์มโปรดระบุว่า
คำตอบ:
นี่คือรายการความแตกต่าง ฉันได้เน้นคุณลักษณะเฉพาะของ Oracle และหวังว่าชุมชนจะสามารถเพิ่มความแตกต่างเฉพาะของผู้จำหน่ายรายอื่นได้เช่นกัน ความแตกต่างที่พบได้ทั่วไปกับผู้ขายส่วนใหญ่สามารถลงใต้หัวข้อได้โดยตรง
หากคุณต้องการลบแถวทั้งหมดอย่างรวดเร็วจากตารางและคุณแน่ใจจริงๆว่าคุณต้องการที่จะทำและคุณไม่มีคีย์ต่างประเทศเทียบกับตารางแล้ว TRUNCATE น่าจะเร็วกว่า DELETE .
ต้องพิจารณาประเด็นเฉพาะของระบบที่หลากหลายตามรายละเอียดด้านล่าง
ลบคือ DML ตัดให้ได้ DDL ( DDL และ DML คืออะไร )
เปลี่ยนแปลงโดยผู้ขาย
เซิร์ฟเวอร์ SQL *
Truncate สามารถย้อนกลับได้
PostgreSQL
Truncate สามารถย้อนกลับได้
คำพยากรณ์
เนื่องจาก TRUNCATE เป็น DDL มันเกี่ยวข้องกับสองคอมมิชชันหนึ่งอันก่อนหน้าและอีกอันหนึ่งหลังจากการดำเนินการคำสั่ง Truncate ไม่สามารถย้อนกลับได้และความล้มเหลวในกระบวนการ truncate จะมีการกระทำ
อย่างไรก็ตามดู Flashback ด้านล่าง
ลบไม่ได้กู้คืนพื้นที่ตัดทอนกู้คืนพื้นที่
คำพยากรณ์
หากคุณใช้ส่วนคำสั่ง REUSE STORAGE แล้วส่วนของข้อมูลจะไม่ถูกยกเลิกการจัดสรรซึ่งจะมีประสิทธิภาพมากขึ้นเล็กน้อยหากตารางจะถูกโหลดซ้ำกับข้อมูล เครื่องหมายน้ำสูงถูกรีเซ็ต
การลบสามารถใช้เพื่อลบแถวทั้งหมดหรือเฉพาะชุดย่อยของแถว ตัดทอนลบแถวทั้งหมด
คำพยากรณ์
เมื่อตารางถูกแบ่งพาร์ติชันแต่ละพาร์ติชันสามารถถูกตัดทอนในการแยกดังนั้นการลบบางส่วนของข้อมูลทั้งหมดของตารางเป็นไปได้
การลบสามารถนำไปใช้กับตารางและตารางภายในคลัสเตอร์ การตัดปลายใช้กับตารางหรือทั้งคลัสเตอร์เท่านั้น (อาจเฉพาะ Oracle)
คำพยากรณ์
การลบไม่ส่งผลกระทบต่อ id วัตถุข้อมูล แต่การตัดทอนจะกำหนดรหัสวัตถุข้อมูลใหม่ยกเว้นกรณีที่ไม่เคยมีการแทรกลงในตารางตั้งแต่การสร้างแม้ว่าการแทรกเพียงครั้งเดียวที่ถูกย้อนกลับจะทำให้ id วัตถุข้อมูลใหม่ถูกกำหนดโดยการตัด .
รำลึกความหลังทำงานข้ามการลบ แต่การตัดทอนป้องกันไม่ให้ย้อนรำลึกถึงก่อนการดำเนินการ
อย่างไรก็ตามจาก 11gR2 คุณลักษณะ FLASHBACK ARCHIVE อนุญาตให้ทำได้ยกเว้นใน Express Edition
การใช้ FLASHBACK ใน Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
ตัวแปร
คำพยากรณ์
สามารถให้สิทธิ์การลบบนตารางแก่ผู้ใช้หรือบทบาทอื่น แต่การตัดปลายไม่สามารถทำได้โดยไม่ใช้สิทธิ์ DROP ANY TABLE ใด ๆ
ลบสร้างการทำซ้ำจำนวนเล็กน้อยและการเลิกทำจำนวนมาก การตัดจะสร้างจำนวนเล็กน้อยของแต่ละรายการ
คำพยากรณ์
การดำเนินการที่ตัดปลายทำให้ดัชนีใช้ไม่ได้อีกครั้ง ลบไม่ได้
การตัดทอนไม่สามารถนำมาใช้ได้เมื่อคีย์ต่างประเทศที่เปิดใช้งานอ้างอิงตาราง การรักษาด้วยการลบขึ้นอยู่กับการกำหนดค่าของปุ่มต่างประเทศ
คำพยากรณ์
การตัดปลายต้องใช้การล็อคตารางแบบเอกสิทธิ์เฉพาะบุคคลการลบต้องใช้การล็อคตารางแบบแบ่งใช้ ดังนั้นการปิดใช้งานการล็อคตารางเป็นวิธีการป้องกันการตัดทอนการดำเนินการบนตาราง
ทริกเกอร์ DML ไม่ทำงานเมื่อถูกตัดทอน
คำพยากรณ์
มีทริกเกอร์ DDL
คำพยากรณ์
ไม่สามารถตัดทอนผ่านลิงก์ฐานข้อมูล
เซิร์ฟเวอร์ SQL *
Truncate รีเซ็ตลำดับสำหรับประเภทคอลัมน์ IDENTITY แต่ลบไม่ได้
ในการใช้งานส่วนใหญ่DELETE
คำสั่งสามารถกลับไปยังลูกค้าแถวที่ถูกลบไปยังลูกค้า
เช่นในโปรแกรมย่อย Oracle PL / SQL คุณสามารถ:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
ความแตกต่างระหว่างการตัดและลบอยู่ด้านล่าง:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
DROP
คำสั่ง DROP ลบตารางออกจากฐานข้อมูล แถวดัชนีและสิทธิ์ทั้งหมดของตารางจะถูกลบด้วย ไม่มีทริกเกอร์ DML จะถูกไล่ออก ไม่สามารถย้อนกลับการทำงานได้
ตัด
TRUNCATE ลบแถวทั้งหมดออกจากตาราง ไม่สามารถย้อนกลับการทำงานได้และจะไม่มีการเปิดใช้ทริกเกอร์ TRUNCATE เร็วกว่าและไม่ใช้พื้นที่ในการเลิกทำการลบ การล็อคระดับตารางจะถูกเพิ่มเมื่อตัดทอน
ลบ
คำสั่ง DELETE ใช้เพื่อลบแถวออกจากตาราง ส่วนคำสั่ง WHERE สามารถใช้เพื่อลบบางแถวเท่านั้น หากไม่มีการระบุเงื่อนไข WHERE แถวทั้งหมดจะถูกลบออก หลังจากดำเนินการลบคุณต้องยอมรับหรือย้อนกลับการทำธุรกรรมเพื่อทำการเปลี่ยนแปลงถาวรหรือเพื่อยกเลิก โปรดทราบว่าการดำเนินการนี้จะทำให้ทริกเกอร์ DELETE ทั้งหมดบนโต๊ะทำงาน การล็อคระดับแถวจะถูกเพิ่มเมื่อทำการลบ
จาก: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
คำตอบที่ดีทั้งหมดที่ฉันต้องเพิ่ม:
เนื่องจากTRUNCATE TABLE
เป็น DDL ( Data Defination Language ) ไม่ใช่คำสั่งDML ( Data Manipulation Langauge ) จึงDelete Triggers
ไม่ต้องรัน
สรุปการลบ Vs Truncate ในเซิร์ฟเวอร์ SQL
สำหรับบทความที่สมบูรณ์ไปที่ลิงก์นี้: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
บทความจาก dotnet mob: ลบ Vs Truncate ใน SQL Server
ด้วย SQL Server หรือ MySQL ถ้ามี PK พร้อมการเพิ่มอัตโนมัติการตัดจะรีเซ็ตตัวนับ
DBCC CHECKIDENT (table_name, RESEED, 1)
"การตัดไม่บันทึกอะไรเลย" ถูกต้อง ฉันจะไปต่อ:
Truncate ไม่ได้ถูกดำเนินการในบริบทของการทำธุรกรรม
ข้อได้เปรียบด้านความเร็วของการถูกตัดทอนทับการลบควรชัดเจน ความได้เปรียบนั้นมีตั้งแต่เล็กน้อยไปจนถึงขนาดใหญ่ขึ้นอยู่กับสถานการณ์ของคุณ
อย่างไรก็ตามฉันเห็นการตัดทอนความสมบูรณ์ของการอ้างอิงโดยไม่ตั้งใจและละเมิดข้อ จำกัด อื่น ๆ พลังที่คุณได้รับจากการแก้ไขข้อมูลภายนอกการทำธุรกรรมจะต้องมีความสมดุลกับความรับผิดชอบที่คุณได้รับเมื่อคุณเดินไต่เชือกโดยไม่ต้องใช้เน็ต
TRUNCATE
เป็นคำสั่ง DDL โดยที่DELETE
เป็นคำสั่ง DML ด้านล่างคือความแตกต่างระหว่างสอง:
ในฐานะที่TRUNCATE
เป็นคำสั่ง DDL ( Data definition language ) มันไม่จำเป็นต้องมีการส่งคำสั่งเพื่อทำการเปลี่ยนแปลงแบบถาวร และนี่คือเหตุผลที่แถวที่ถูกลบโดยการตัดไม่สามารถย้อนกลับได้ ในทางกลับกันDELETE
คำสั่ง DML ( ภาษาการจัดการข้อมูล ) จึงต้องยอมรับอย่างชัดเจนเพื่อให้มีผลถาวร
TRUNCATE
ลบแถวทั้งหมดออกจากตารางเสมอเว้นว่างไว้และโครงสร้างตารางยังคงอยู่โดยที่DELETE
อาจลบเงื่อนไขหากใช้คำสั่งย่อยที่ใด
แถวที่ถูกลบโดยTRUNCATE TABLE
คำสั่งไม่สามารถกู้คืนได้และคุณไม่สามารถระบุตำแหน่งของประโยคในTRUNCATE
คำสั่งได้
TRUNCATE
คำสั่งไม่เรียกใช้ทริกเกอร์ซึ่งตรงข้ามกับที่ลบทริกเกอร์ในDELETE
คำสั่ง
นี่คือลิงค์ที่ดีมากที่เกี่ยวข้องกับหัวข้อ
ใช่ลบช้ากว่า TRUNCATE เร็วขึ้น ทำไม?
DELETE จะต้องอ่านบันทึกตรวจสอบข้อ จำกัด อัปเดตบล็อกอัปเดตดัชนีและสร้างการทำซ้ำ / เลิกทำ ทั้งหมดนั้นต้องใช้เวลา
TRUNCATE เพียงปรับตัวชี้ในฐานข้อมูลสำหรับตาราง (High Water Mark) และกะเทย! ข้อมูลหายไป
นี่คือ Oracle เฉพาะ AFAIK
ตัด
TRUNCATE แบบสอบถาม SQL จะลบแถวทั้งหมดออกจากตารางโดยไม่ต้องบันทึกการลบแถวแต่ละรายการ
ลบ
ในการดำเนินการคิว DELETE จำเป็นต้องมีการอนุญาตให้ลบในตารางเป้าหมาย หากคุณต้องการใช้ WHERE clause ใน DELETE จำเป็นต้องเลือกการอนุญาตเช่นกัน
หากคุณลบข้อมูลทั้งหมดออกจากตารางโดยไม่ตั้งใจโดยใช้ Delete / Truncate คุณสามารถย้อนกลับการทำธุรกรรมที่มุ่งมั่น กู้คืนการสำรองข้อมูลล่าสุดและเรียกใช้บันทึกการทำธุรกรรมจนถึงเวลาที่ Delete / Truncate กำลังเกิดขึ้น
ข้อมูลที่เกี่ยวข้องด้านล่างมาจากบล็อกโพสต์ :
ขณะที่ทำงานกับฐานข้อมูลเราใช้ Delete และ Truncate โดยไม่ทราบความแตกต่างระหว่างมัน ในบทความนี้เราจะพูดถึงความแตกต่างระหว่าง Delete และ Truncate ใน Sql
ลบ:
- Delete เป็นคำสั่ง DML
- คำสั่งลบจะถูกดำเนินการโดยใช้การล็อคแถวแต่ละแถวในตารางจะถูกล็อคเพื่อลบ
- เราสามารถระบุตัวกรองในกรณีที่ข้อ
- มันจะลบข้อมูลที่ระบุหากมีเงื่อนไขอยู่
- ลบกิจกรรมที่ทริกเกอร์เนื่องจากการดำเนินการถูกบันทึกเป็นรายบุคคล
- ช้ากว่า Truncate เพราะเก็บบันทึก
ตัด
- Truncate เป็นคำสั่ง DDL
- ตัดทอนตารางเสมอล็อคตารางและหน้า แต่ไม่ใช่แต่ละแถวเนื่องจากจะลบข้อมูลทั้งหมด
- ไม่สามารถใช้เงื่อนไขของสถานที่ได้
- มันลบข้อมูลทั้งหมด
- ตารางที่ถูกตัดไม่สามารถเปิดใช้ทริกเกอร์ได้เนื่องจากการดำเนินการไม่ได้บันทึกการลบแถวแต่ละแถว
- ประสิทธิภาพได้เร็วขึ้นเนื่องจากไม่ได้เก็บบันทึกใด ๆ
หมายเหตุ: ลบและตัดทอนทั้งสองสามารถย้อนกลับเมื่อใช้กับธุรกรรม หากธุรกรรมเสร็จสิ้นหมายถึงการส่งคำสั่งแล้วเราไม่สามารถย้อนกลับคำสั่ง Truncate ได้ แต่เรายังคงสามารถย้อนกลับคำสั่ง Delete จากไฟล์ Log ได้เนื่องจากลบเขียนบันทึกไว้ในไฟล์ Log ในกรณีที่จำเป็นต้องย้อนกลับในอนาคตจากล็อกไฟล์
หากคุณมีข้อ จำกัด กุญแจต่างประเทศที่อ้างถึงตารางที่คุณพยายามตัดทอนสิ่งนี้จะไม่ทำงานแม้ว่าตารางอ้างอิงจะไม่มีข้อมูลอยู่ในนั้น นี่เป็นเพราะการตรวจสอบ foreign key ทำได้ด้วย DDL แทนที่จะเป็น DML สิ่งนี้สามารถแก้ไขได้โดยการปิดการใช้งานข้อ จำกัด foreign key ในตาราง
ตารางลบเป็นการดำเนินการที่บันทึกไว้ ดังนั้นการลบแต่ละแถวจะได้รับการบันทึกในบันทึกการทำธุรกรรมซึ่งทำให้ช้าลง ตารางที่ถูกตัดทอนยังลบแถวทั้งหมดในตาราง แต่จะไม่บันทึกการลบของแต่ละแถวแทนมันจะบันทึกการจัดสรรคืนของหน้าข้อมูลของตารางซึ่งทำให้เร็วขึ้น
~ หากเผลอลบข้อมูลทั้งหมดออกจากตารางโดยใช้ Delete / Truncate คุณสามารถย้อนกลับการทำธุรกรรมที่มุ่งมั่น กู้คืนการสำรองข้อมูลล่าสุดและเรียกใช้บันทึกการทำธุรกรรมจนถึงเวลาที่ Delete / Truncate กำลังเกิดขึ้น
ใน SQL Server 2005 ฉันเชื่อว่าคุณสามารถย้อนกลับการตัดทอน
ลบ
คำสั่ง DELETE ใช้เพื่อลบแถวออกจากตาราง ส่วนคำสั่ง WHERE สามารถใช้เพื่อลบบางแถวเท่านั้น หากไม่มีการระบุเงื่อนไข WHERE แถวทั้งหมดจะถูกลบออก หลังจากดำเนินการลบคุณต้องยอมรับหรือย้อนกลับการทำธุรกรรมเพื่อทำการเปลี่ยนแปลงถาวรหรือเพื่อยกเลิก โปรดทราบว่าการดำเนินการนี้จะทำให้ทริกเกอร์ DELETE ทั้งหมดบนโต๊ะทำงาน
ตัด
TRUNCATE ลบแถวทั้งหมดออกจากตาราง ไม่สามารถย้อนกลับการทำงานได้และจะไม่มีการเปิดใช้ทริกเกอร์ ดังนั้น TRUCATE จึงเร็วกว่าและไม่ได้ใช้พื้นที่ในการเลิกทำการลบอย่างมาก
DROP
คำสั่ง DROP ลบตารางออกจากฐานข้อมูล แถวดัชนีและสิทธิ์ทั้งหมดของตารางจะถูกลบด้วย ไม่มีทริกเกอร์ DML จะถูกไล่ออก ไม่สามารถย้อนกลับการทำงานได้
DROP และ TRUNCATE เป็นคำสั่ง DDL ในขณะที่ DELETE เป็นคำสั่ง DML ดังนั้นการดำเนินการ DELETE สามารถย้อนกลับ (ยกเลิก) ในขณะที่การดำเนินการ DROP และ TRUNCATE ไม่สามารถย้อนกลับได้
จาก: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE สามารถย้อนกลับได้หากห่อในการทำธุรกรรม
โปรดดูข้อมูลอ้างอิงทั้งสองด้านล่างและทดสอบด้วยตนเอง: -
TRUNCATE vs. DELETE เป็นหนึ่งในคำถามที่น่าอับอายระหว่างการสัมภาษณ์ SQL เพียงให้แน่ใจว่าคุณอธิบายให้ถูกต้องกับผู้สัมภาษณ์ไม่เช่นนั้นคุณอาจเสียค่าใช้จ่าย ปัญหาคือมีคนไม่มากนักที่รู้ว่าพวกเขาจะพิจารณาคำตอบว่าผิดถ้าคุณบอกพวกเขาว่าสามารถตัดทอน YES ได้
การแก้ไขเพียงเล็กน้อยสำหรับคำตอบดั้งเดิม - การลบยังสร้างการทำซ้ำจำนวนมาก (เนื่องจากการยกเลิกการป้องกันจะถูกทำซ้ำโดยการทำซ้ำ) สิ่งนี้สามารถเห็นได้จากเอาต์พุตอัตโนมัติ:
SQL> delete from t1;
10918 rows deleted.
Elapsed: 00:00:00.58
Execution Plan
----------------------------------------------------------
0 DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
1 0 DELETE OF 'T1'
2 1 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)
Statistics
----------------------------------------------------------
30 recursive calls
12118 db block gets
213 consistent gets
142 physical reads
3975328 redo size
441 bytes sent via SQL*Net to client
537 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
10918 rows processed
นี่คือคำตอบโดยละเอียดของฉันเกี่ยวกับความแตกต่างระหว่าง DELETE และ TRUNCATE ใน SQL Server
• ลบข้อมูล : สิ่งแรกก่อนทั้งคู่สามารถใช้เพื่อลบแถวออกจากตาราง
แต่การลบสามารถใช้เพื่อลบแถวไม่เพียง แต่จากตาราง แต่ยังจาก VIEW หรือผลลัพธ์ของ OPENROWSET หรือ OPENQUERY ภายใต้ความสามารถของผู้ให้บริการ
• FROM Clause : ด้วย DELETE คุณสามารถลบแถวจากหนึ่งตาราง / view / rowset_function_limited ตามแถวจากตารางอื่นโดยใช้ FROM clause อื่น ในประโยค FROM นั้นคุณยังสามารถเขียนเงื่อนไขการเข้าร่วมปกติได้ ที่จริงแล้วคุณสามารถสร้างคำสั่ง DELETE จากคำสั่ง SELECT ที่ไม่มีฟังก์ชั่นรวมโดยแทนที่ SELECT ด้วย DELETE และลบชื่อคอลัมน์
ด้วย TRUNCATE คุณไม่สามารถทำได้
• WHERE : TRUNCATE ไม่สามารถมีเงื่อนไขได้ แต่ DELETE สามารถ ซึ่งหมายความว่าด้วย TRUNCATE คุณไม่สามารถลบแถวหรือกลุ่มของแถวที่ระบุได้ TRUNCATE TABLE คล้ายกับคำสั่ง DELETE โดยไม่มี WHERE clause
• ประสิทธิภาพ : TRUNCATE TABLE เร็วขึ้นและใช้ทรัพยากรน้อยลงในระบบและทรานแซคชันธุรกรรม และหนึ่งในเหตุผลก็คือล็อคที่ใช้โดยทั้งสองคำสั่ง คำสั่ง DELETE ดำเนินการโดยใช้การล็อคแถวแต่ละแถวในตารางจะถูกล็อคเพื่อลบ TRUNCATE TABLE จะล็อคตารางและหน้า แต่จะไม่ล็อคแต่ละแถว
• บันทึกการทำธุรกรรม : คำสั่ง DELETE ลบแถวทีละครั้งและสร้างแต่ละรายการในบันทึกธุรกรรมสำหรับแต่ละแถว
TRUNCATE TABLE ลบข้อมูลโดยการยกเลิกการจัดสรรหน้าข้อมูลที่ใช้ในการจัดเก็บข้อมูลตารางและบันทึกเฉพาะการยกเลิกการจัดสรรหน้าในบันทึกการทำธุรกรรม
• หน้า : หลังจากรันคำสั่ง DELETE ตารางยังสามารถมีหน้าว่างได้ TRUNCATE ลบข้อมูลโดยการยกเลิกการจัดสรรหน้าข้อมูลที่ใช้ในการจัดเก็บข้อมูลตาราง
• ทริกเกอร์ : TRUNCATE ไม่เปิดใช้งานทริกเกอร์ลบบนตาราง ดังนั้นคุณจะต้องระมัดระวังในการใช้ TRUNCATE สิ่งหนึ่งที่ไม่ควรใช้ TRUNCATE หากลบทริกเกอร์ที่กำหนดไว้ในตารางเพื่อทำการล้างข้อมูลอัตโนมัติหรือการกระทำการบันทึกเมื่อลบแถว
• คอลัมน์ Identity : ด้วย TRUNCATE หากตารางมีคอลัมน์ข้อมูลเฉพาะตัวตัวนับสำหรับคอลัมน์นั้นจะถูกรีเซ็ตเป็นค่าเมล็ดที่กำหนดไว้สำหรับคอลัมน์ หากไม่มีการกำหนดเมล็ดพันธุ์จะใช้ค่าเริ่มต้น 1 DELETE ไม่รีเซ็ตตัวนับตัวตน ดังนั้นหากคุณต้องการเก็บตัวนับข้อมูลประจำตัวไว้ให้ใช้ DELETE แทน
• การจำลองแบบ : DELETE สามารถใช้กับตารางที่ใช้ในการจำลองแบบของทรานแซคชันหรือการจำลองแบบผสาน
ในขณะที่ TRUNCATE ไม่สามารถใช้กับตารางที่เกี่ยวข้องในการจำลองแบบของทรานแซคชันหรือการจำลองแบบผสาน
•การ ย้อนกลับ : คำสั่ง DELETE สามารถย้อนกลับได้
TRUNCATE สามารถย้อนกลับได้หากมันอยู่ในบล็อคธุรกรรมและไม่ปิดเซสชัน เมื่อปิดเซสชันแล้วคุณจะไม่สามารถย้อนกลับได้ TRUNCATE
• ข้อ จำกัด : คำสั่ง DELETE อาจล้มเหลวหากมีการละเมิดทริกเกอร์หรือพยายามที่จะลบแถวที่อ้างอิงโดยข้อมูลในตารางอื่นด้วยข้อ จำกัด ของคีย์ต่างประเทศ หาก DELETE ลบหลายแถวและแถวใดแถวหนึ่งที่ถูกลบนั้นละเมิดทริกเกอร์หรือข้อ จำกัด คำสั่งจะถูกยกเลิกข้อผิดพลาดจะถูกส่งกลับและไม่มีการลบแถวใด ๆ ออก
และหากใช้ DELETE กับมุมมองมุมมองนั้นจะต้องเป็นมุมมองที่อัปเดตได้ TRUNCATE ไม่สามารถใช้กับตารางที่ใช้ในมุมมองแบบดัชนี
TRUNCATE ไม่สามารถใช้กับตารางที่อ้างถึงโดยข้อ จำกัด ของ FOREIGN KEY ยกเว้นว่าตารางที่มี foreign key ที่อ้างถึงตัวมันเอง
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
ความแตกต่างที่ใหญ่ที่สุดคือการตัดทอนไม่ใช่การดำเนินการบันทึกในขณะที่การลบคือ
เพียงหมายความว่าในกรณีที่ฐานข้อมูลขัดข้องคุณไม่สามารถกู้คืนข้อมูลที่ดำเนินการโดยการตัดทอน แต่ด้วยการลบที่คุณสามารถทำได้
รายละเอียดเพิ่มเติมที่นี่
คำสั่ง DELETE: คำสั่งนี้จะลบเฉพาะแถวออกจากตารางโดยยึดตามเงื่อนไขที่กำหนดไว้ในส่วนคำสั่งหรือลบแถวทั้งหมดออกจากตารางหากไม่มีการระบุเงื่อนไข แต่มันจะไม่เพิ่มพื้นที่ว่างที่มีอยู่ในตาราง
ไวยากรณ์ของคำสั่ง SQL DELETE คือ:
ลบจาก table_name [เงื่อนไข WHERE];
คำสั่ง TRUNCATE: คำสั่งนี้ใช้เพื่อลบแถวทั้งหมดออกจากตารางและเพิ่มพื้นที่ว่างที่มีตาราง
ลบ
DELETE is a DML command DELETE you can rollback Delete = Only Delete- so it can be rolled back In DELETE you can write conditions using WHERE clause Syntax – Delete from [Table] where [Condition]
ตัด
TRUNCATE is a DDL command You can't rollback in TRUNCATE, TRUNCATE removes the record permanently Truncate = Delete+Commit -so we can't roll back You can't use conditions(WHERE clause) in TRUNCATE Syntax – Truncate table [Table]
สำหรับรายละเอียดเพิ่มเติมเยี่ยมชม
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
ความแตกต่างอีกอย่างหนึ่งของการดำเนินการสองอย่างคือถ้าตารางมีคอลัมน์ข้อมูลเฉพาะตัวตัวนับสำหรับคอลัมน์นั้นจะถูกรีเซ็ต 1 (หรือเป็นค่าเมล็ดที่กำหนดไว้สำหรับคอลัมน์) ภายใต้ TRUNCATE DELETE ไม่มีผลกระทบนี้
กล่าวโดยย่อการตัดจะไม่บันทึกสิ่งใด (เร็วกว่ามาก แต่ไม่สามารถยกเลิกได้) ในขณะที่การลบถูกบันทึกไว้ (และอาจเป็นส่วนหนึ่งของธุรกรรมที่มีขนาดใหญ่กว่าจะย้อนกลับเป็นต้น) หากคุณมีข้อมูลที่คุณไม่ต้องการในตารางใน dev โดยปกติแล้วจะดีกว่าที่จะตัดทอนเนื่องจากคุณไม่เสี่ยงต่อการกรอกบันทึกการทำธุรกรรม
เหตุผลใหญ่ที่มีประโยชน์คือเมื่อคุณต้องการรีเฟรชข้อมูลในตารางหลายล้านแถว แต่ไม่ต้องการสร้างใหม่ "Delete *" จะใช้เวลาตลอดไปในขณะที่ผลกระทบของ Truncate จะไม่สำคัญ
ไม่สามารถทำ DDL ผ่าน dblink ได้
ฉันจะแสดงความคิดเห็นในโพสต์ของ matthieu แต่ฉันยังไม่มีตัวแทน ...
ใน MySQL ตัวนับการเพิ่มอัตโนมัติจะถูกรีเซ็ตด้วยการตัดทอน แต่ไม่ใช่ด้วยการลบ
ไม่ใช่ว่า truncate จะไม่บันทึกสิ่งใดใน SQL Server truncate ไม่ได้บันทึกข้อมูลใด ๆ แต่จะบันทึกการยกเลิกการจัดสรรหน้าข้อมูลสำหรับตารางที่คุณเรียกใช้ TRUNCATE
และเร็กคอร์ดที่ถูกตัดทอนสามารถย้อนกลับได้ถ้าเรากำหนดธุรกรรมที่จุดเริ่มต้นและเราสามารถกู้คืนเร็กคอร์ดที่ถูกตัดทอนได้หลังจากย้อนกลับ แต่ไม่สามารถกู้คืนเร็กคอร์ดที่ถูกตัดทอนจากการสำรองข้อมูลล็อกธุรกรรมหลังจากทำธุรกรรมที่ถูกตัดทอน
การตัดทอนสามารถย้อนกลับไปที่ exapmle ได้ที่นี่
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
ตัดและลบใน SQL เป็นสองคำสั่งที่ใช้ในการลบหรือลบข้อมูลจากตาราง แม้ว่าพื้นฐานค่อนข้างเป็นธรรมชาติทั้งคำสั่ง Sql สามารถสร้างปัญหามากมายจนกว่าคุณจะคุ้นเคยกับรายละเอียดก่อนที่จะใช้ ตัวเลือกคำสั่งที่ไม่ถูกต้องอาจส่งผลให้เกิดกระบวนการที่ช้ามากหรืออาจทำให้เกิดปัญหาเซ็กเมนต์ท่อนข้อมูลถ้าจำเป็นต้องลบข้อมูลมากเกินไปและเซ็กเมนต์บันทึกไม่เพียงพอ ด้วยเหตุนี้จึงเป็นเรื่องสำคัญที่จะต้องรู้ว่าเมื่อใดที่จะใช้คำสั่ง truncate และ delete ใน SQL แต่ก่อนที่จะใช้สิ่งเหล่านี้คุณควรทราบถึงความแตกต่างระหว่าง Truncate และ Delete และจากนั้นเราควรจะทราบได้เมื่อ DELETE data หรือ TRUNCATE ควรใช้เพื่อล้างตาราง
ดูรายละเอียดคลิกที่นี่
โดยการออกคำสั่ง TRUNCATE TABLE คุณกำลังสั่งให้ SQL Server ลบทุก ๆ ระเบียนภายในตารางโดยไม่ต้องมีการบันทึกหรือการประมวลผลธุรกรรม
คำสั่ง DELETE สามารถมี WHERE clause เพื่อลบเร็กคอร์ดที่ระบุในขณะที่คำสั่ง TRUNCATE ไม่ต้องการอะไรและเช็ดทั้งตาราง ที่สำคัญคำสั่ง DELETE บันทึกวันที่ถูกลบในขณะที่คำสั่ง TRUNCATE ไม่
ความแตกต่างอีกประการหนึ่งสำหรับเซิร์ฟเวอร์ microsoft sql คือdelete
คุณสามารถใช้output
คำสั่งเพื่อติดตามว่าข้อมูลใดที่ถูกลบไปเช่น:
delete from [SomeTable]
output deleted.Id, deleted.Name
truncate
คุณไม่สามารถทำเช่นนี้กับ