ความแตกต่างระหว่าง TRUNCATE และ DELETE ใน SQL คืออะไร


303

ความแตกต่างระหว่างTRUNCATEและDELETEใน SQL คืออะไร?

หากคำตอบของคุณเฉพาะแพลตฟอร์มโปรดระบุว่า


4
คำตอบทั้งหมดนั้นขึ้นอยู่กับแต่ละแพลตฟอร์ม ไม่มีคำสั่ง TRUNCATE ใน SQL มาตรฐาน ดังนั้นจึงเป็นคุณสมบัติที่เป็นกรรมสิทธิ์และหมายถึงสิ่งที่แตกต่างกับผู้ขาย DBMS แต่ละราย
nvogel

คำตอบคือการใช้งานที่เฉพาะเจาะจงอย่างที่มันเป็นเพราะ sqlvogel ชี้ให้เห็นว่านี่เป็นคำสั่งที่ไม่ได้มาตรฐาน (TRUNCATE) ปล่อยให้คำว่า "oracle" ที่ติดแท็กนี้หรือทำให้มันเป็นคำตอบแบบชุมชน - วิกิและวางผลที่ตามมาสำหรับแต่ละ RDBMS ที่สำคัญ (Oracle, MS-MSQL, PostgreSQL ทั้งหมดใช้ TRUNCATE ... )
reedstrm

หากธุรกรรมเสร็จสิ้นหมายถึง COMMITED แล้วเราไม่สามารถย้อนกลับคำสั่ง TRUNCATE แต่เรายังคงสามารถย้อนกลับคำสั่ง DELETE จากไฟล์ LOG ได้เนื่องจาก DELETE เขียนบันทึกไว้ในไฟล์ Log ในกรณีที่จำเป็นต้องย้อนกลับในอนาคตจากไฟล์ LOG

คำตอบ:


272

นี่คือรายการความแตกต่าง ฉันได้เน้นคุณลักษณะเฉพาะของ Oracle และหวังว่าชุมชนจะสามารถเพิ่มความแตกต่างเฉพาะของผู้จำหน่ายรายอื่นได้เช่นกัน ความแตกต่างที่พบได้ทั่วไปกับผู้ขายส่วนใหญ่สามารถลงใต้หัวข้อได้โดยตรง


ภาพรวมทั่วไป

หากคุณต้องการลบแถวทั้งหมดอย่างรวดเร็วจากตารางและคุณแน่ใจจริงๆว่าคุณต้องการที่จะทำและคุณไม่มีคีย์ต่างประเทศเทียบกับตารางแล้ว TRUNCATE น่าจะเร็วกว่า DELETE .

ต้องพิจารณาประเด็นเฉพาะของระบบที่หลากหลายตามรายละเอียดด้านล่าง


ประเภทใบแจ้งยอด

ลบคือ DML ตัดให้ได้ DDL ( DDL และ DML คืออะไร )


กระทำและย้อนกลับ

เปลี่ยนแปลงโดยผู้ขาย

เซิร์ฟเวอร์ SQL *

Truncate สามารถย้อนกลับได้

PostgreSQL

Truncate สามารถย้อนกลับได้

คำพยากรณ์

เนื่องจาก TRUNCATE เป็น DDL มันเกี่ยวข้องกับสองคอมมิชชันหนึ่งอันก่อนหน้าและอีกอันหนึ่งหลังจากการดำเนินการคำสั่ง Truncate ไม่สามารถย้อนกลับได้และความล้มเหลวในกระบวนการ truncate จะมีการกระทำ

อย่างไรก็ตามดู Flashback ด้านล่าง


การบุกเบิกอวกาศ

ลบไม่ได้กู้คืนพื้นที่ตัดทอนกู้คืนพื้นที่

คำพยากรณ์

หากคุณใช้ส่วนคำสั่ง REUSE STORAGE แล้วส่วนของข้อมูลจะไม่ถูกยกเลิกการจัดสรรซึ่งจะมีประสิทธิภาพมากขึ้นเล็กน้อยหากตารางจะถูกโหลดซ้ำกับข้อมูล เครื่องหมายน้ำสูงถูกรีเซ็ต


ขอบเขตของแถว

การลบสามารถใช้เพื่อลบแถวทั้งหมดหรือเฉพาะชุดย่อยของแถว ตัดทอนลบแถวทั้งหมด

คำพยากรณ์

เมื่อตารางถูกแบ่งพาร์ติชันแต่ละพาร์ติชันสามารถถูกตัดทอนในการแยกดังนั้นการลบบางส่วนของข้อมูลทั้งหมดของตารางเป็นไปได้


ประเภทวัตถุ

การลบสามารถนำไปใช้กับตารางและตารางภายในคลัสเตอร์ การตัดปลายใช้กับตารางหรือทั้งคลัสเตอร์เท่านั้น (อาจเฉพาะ Oracle)


ข้อมูลวัตถุตัวตน

คำพยากรณ์

การลบไม่ส่งผลกระทบต่อ id วัตถุข้อมูล แต่การตัดทอนจะกำหนดรหัสวัตถุข้อมูลใหม่ยกเว้นกรณีที่ไม่เคยมีการแทรกลงในตารางตั้งแต่การสร้างแม้ว่าการแทรกเพียงครั้งเดียวที่ถูกย้อนกลับจะทำให้ id วัตถุข้อมูลใหม่ถูกกำหนดโดยการตัด .


รำลึกความหลัง (Oracle)

รำลึกความหลังทำงานข้ามการลบ แต่การตัดทอนป้องกันไม่ให้ย้อนรำลึกถึงก่อนการดำเนินการ

อย่างไรก็ตามจาก 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;

ไม่เข้าใจคำแถลงที่ 4 ของคุณ: ถ้าฉันพูดว่า DELETE [ ] จากตาราง; จากนั้น * ทุกแถวในตารางนั้นจะถูกลบเว้นแต่ว่า FK จะหยุดมัน โดยวิธีการที่ฉันคิดว่านี่เป็น SQL Server เฉพาะคุณไม่สามารถใช้ TRUNCATE บนตารางที่มี FK
Joe Pineda

ความเห็นเพิ่มเติม: ฉันไม่เห็นด้วยกับคำสั่งที่ 3 ของคุณยกเว้นว่าเป็นคำเฉพาะของ Oracle อย่างน้อยกับ SQL S. อย่างใดอย่างหนึ่งถ้าคุณลบหรือตัดทอนคุณไม่ได้กู้คืนพื้นที่ (เช่นไฟล์ฐานข้อมูลจะไม่ลดขนาดลงในฮาร์ดไดรฟ์) เว้นแต่คุณจะขอเป็นพิเศษ
Joe Pineda

1
ข้อความที่ 5: คุณสามารถย้อนกลับตาราง TRUNCATE ใน sql 2008 r2 ได้
Eric Labashosky

1
Postgresql สามารถย้อนกลับ TRUNCATE และดังนั้นจึงไม่ได้ทำการลงนามโดยอัตโนมัติ
rfusca

5
DELETE ส่งคืนจำนวนแถวที่ถูกลบ แต่ TRUNCATE ไม่ได้ เป็นจุดที่โง่มาก แต่ก็คุ้มค่าที่จะกล่าวถึง :)
Deepak Kumar Jha

191

ความแตกต่างระหว่างการตัดและลบอยู่ด้านล่าง:

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+

ตัดการตั้งค่าข้อมูลประจำตัวของตารางใหม่หมายความว่าอย่างไร แต่แล้วลบล่ะ
Ravi

1
@jWeaver: หมายความว่าเมื่อคุณตั้งค่าคุณสมบัติข้อมูลจำเพาะของผู้ใช้เป็น True สำหรับเขตข้อมูลคีย์หลักดังนั้นเมื่อคุณแทรกข้อมูลลงในตารางนั้นคอลัมน์คีย์หลักจะเก็บค่าเช่น 1,2,3,4,5 .... (หาก Identity เริ่มขึ้น จาก 1 และ seed คือ 1) และเมื่อคุณตัดทอนตารางมันจะสูญเสียค่าเอกลักษณ์ทั้งหมดดังนั้นเมื่อคุณเริ่มแทรกข้อมูลลงในตารางนั้นอีกครั้งมันจะเริ่มต้นจาก 1 แทนที่จะเป็นที่ที่เหลืออยู่ ใน DELETE มันจะย้อนกลับมันจะเก็บค่าเอกลักษณ์แม้หลังจากที่คุณเรียกใช้คำสั่ง DELETE ขออภัยสำหรับข้อผิดพลาดในการเปรียบเทียบจุดที่ 2 ในคอลัมน์ DELETE ในภาพด้านบน
Bhaumik Patel

ดูเหมือนว่าคุณกำลังตอบรับSQL Server
Ravi

4
ทั้งตัดและลบสามารถ rolledBack ในSQL SERVER และในแถวที่ 2 DELETE ไม่ได้รีเซ็ตรหัสประจำตัว ตอนนี้คุณจะแก้ไขโพสต์นี้ได้อย่างไร นั่นเป็นสิ่งที่ไม่ดีเกี่ยวกับการใช้รูปภาพใน StackOverflow
Mahmood Jenami

2
การตัดปลายกำลังย้อนกลับ! (เซิร์ฟเวอร์ SQL)
Aimal Khan

55

DROP

คำสั่ง DROP ลบตารางออกจากฐานข้อมูล แถวดัชนีและสิทธิ์ทั้งหมดของตารางจะถูกลบด้วย ไม่มีทริกเกอร์ DML จะถูกไล่ออก ไม่สามารถย้อนกลับการทำงานได้

ตัด

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

ลบ

คำสั่ง DELETE ใช้เพื่อลบแถวออกจากตาราง ส่วนคำสั่ง WHERE สามารถใช้เพื่อลบบางแถวเท่านั้น หากไม่มีการระบุเงื่อนไข WHERE แถวทั้งหมดจะถูกลบออก หลังจากดำเนินการลบคุณต้องยอมรับหรือย้อนกลับการทำธุรกรรมเพื่อทำการเปลี่ยนแปลงถาวรหรือเพื่อยกเลิก โปรดทราบว่าการดำเนินการนี้จะทำให้ทริกเกอร์ DELETE ทั้งหมดบนโต๊ะทำงาน การล็อคระดับแถวจะถูกเพิ่มเมื่อทำการลบ

จาก: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


5
คำอธิบายที่ดีสำหรับผู้เริ่มต้นอย่างฉัน
Vikas Kukreti

สั้นและหวาน
ABH

23

คำตอบที่ดีทั้งหมดที่ฉันต้องเพิ่ม:

เนื่องจากTRUNCATE TABLEเป็น DDL ( Data Defination Language ) ไม่ใช่คำสั่งDML ( Data Manipulation Langauge ) จึงDelete Triggersไม่ต้องรัน


อาทริกเกอร์ ... นั่นเป็นประเด็นที่ดี ฉันจะเพิ่มเข้าไปในรายการที่ฉันทำและให้เครดิตคุณ Polara ถ้าไม่เป็นไร
David Aldridge

SQL Server จะไม่ยอมให้คุณตัดทอนตารางด้วย foreign keys ดังนั้นจุด cascading ของคุณอาจเป็น moot ขึ้นอยู่กับแพลตฟอร์ม
Meff

PostgreSQL มี "TRUNCATE Trigger"
a_horse_with_no_name


17

ด้วย SQL Server หรือ MySQL ถ้ามี PK พร้อมการเพิ่มอัตโนมัติการตัดจะรีเซ็ตตัวนับ


เพื่อชี้แจงนี้เป็นของ SQL Server หากตารางมีคอลัมน์ที่กำหนดเป็นตัวตน ลบจะรักษา ID ที่กำหนดโดยอัตโนมัติล่าสุดในขณะที่ Truncate รีเซ็ตตัวนับ
Codewerks

เนื่องจากคำถามถูกแท็ก ORACLE ดังนั้นคำตอบนี้จึงผิดดังนั้นจึงถูกลดระดับลง
Guy

โอ๊ะไม่เห็นแท็ก oracle :)
Mathieu

+1 จริงและมันรีเซ็ตมัน0 ถ้าคุณต้องการให้มันเป็น1แทน:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

ฉันได้เพิ่มสิ่งนี้ลงในคำตอบของชุมชนและทำให้เป็นมิตรกับการจัดทำเอกสารเฉพาะปัญหาของผู้ขายมากขึ้น
David Aldridge

12

"การตัดไม่บันทึกอะไรเลย" ถูกต้อง ฉันจะไปต่อ:

Truncate ไม่ได้ถูกดำเนินการในบริบทของการทำธุรกรรม

ข้อได้เปรียบด้านความเร็วของการถูกตัดทอนทับการลบควรชัดเจน ความได้เปรียบนั้นมีตั้งแต่เล็กน้อยไปจนถึงขนาดใหญ่ขึ้นอยู่กับสถานการณ์ของคุณ

อย่างไรก็ตามฉันเห็นการตัดทอนความสมบูรณ์ของการอ้างอิงโดยไม่ตั้งใจและละเมิดข้อ จำกัด อื่น ๆ พลังที่คุณได้รับจากการแก้ไขข้อมูลภายนอกการทำธุรกรรมจะต้องมีความสมดุลกับความรับผิดชอบที่คุณได้รับเมื่อคุณเดินไต่เชือกโดยไม่ต้องใช้เน็ต


7

TRUNCATEเป็นคำสั่ง DDL โดยที่DELETEเป็นคำสั่ง DML ด้านล่างคือความแตกต่างระหว่างสอง:

  1. ในฐานะที่TRUNCATEเป็นคำสั่ง DDL ( Data definition language ) มันไม่จำเป็นต้องมีการส่งคำสั่งเพื่อทำการเปลี่ยนแปลงแบบถาวร และนี่คือเหตุผลที่แถวที่ถูกลบโดยการตัดไม่สามารถย้อนกลับได้ ในทางกลับกันDELETEคำสั่ง DML ( ภาษาการจัดการข้อมูล ) จึงต้องยอมรับอย่างชัดเจนเพื่อให้มีผลถาวร

  2. TRUNCATEลบแถวทั้งหมดออกจากตารางเสมอเว้นว่างไว้และโครงสร้างตารางยังคงอยู่โดยที่DELETEอาจลบเงื่อนไขหากใช้คำสั่งย่อยที่ใด

  3. แถวที่ถูกลบโดยTRUNCATE TABLEคำสั่งไม่สามารถกู้คืนได้และคุณไม่สามารถระบุตำแหน่งของประโยคในTRUNCATEคำสั่งได้

  4. TRUNCATEคำสั่งไม่เรียกใช้ทริกเกอร์ซึ่งตรงข้ามกับที่ลบทริกเกอร์ในDELETEคำสั่ง

นี่คือลิงค์ที่ดีมากที่เกี่ยวข้องกับหัวข้อ


6

ใช่ลบช้ากว่า TRUNCATE เร็วขึ้น ทำไม?

DELETE จะต้องอ่านบันทึกตรวจสอบข้อ จำกัด อัปเดตบล็อกอัปเดตดัชนีและสร้างการทำซ้ำ / เลิกทำ ทั้งหมดนั้นต้องใช้เวลา

TRUNCATE เพียงปรับตัวชี้ในฐานข้อมูลสำหรับตาราง (High Water Mark) และกะเทย! ข้อมูลหายไป

นี่คือ Oracle เฉพาะ AFAIK


PostgreSQL ก็คล้ายกันเช่นกัน
Gavin M. Roy

6

ตัด

TRUNCATE แบบสอบถาม SQL จะลบแถวทั้งหมดออกจากตารางโดยไม่ต้องบันทึกการลบแถวแต่ละรายการ

  • TRUNCATE เป็นคำสั่ง DDL
  • TRUNCATE ดำเนินการโดยใช้การล็อคตารางและทั้งตารางถูกล็อคเพื่อลบบันทึกทั้งหมด
  • เราไม่สามารถใช้ WHERE clause กับ TRUNCATE ได้
  • TRUNCATE ลบแถวทั้งหมดออกจากตาราง
  • การเข้าสู่ระบบน้อยที่สุดในบันทึกธุรกรรมดังนั้นจึงเป็นการทำงานที่รวดเร็วขึ้น
  • TRUNCATE TABLE ลบข้อมูลโดยการยกเลิกการจัดสรรหน้าข้อมูลที่ใช้ในการจัดเก็บข้อมูลตารางและบันทึกเฉพาะการยกเลิกการจัดสรรหน้าในบันทึกการทำธุรกรรม
  • ในการใช้ Truncate บนโต๊ะคุณต้องได้รับอนุญาตอย่างน้อย ALTER ในตาราง
  • Truncate ใช้พื้นที่การทำธุรกรรมน้อยกว่าคำสั่ง Delete
  • การตัดไม่สามารถใช้กับมุมมองที่จัดทำดัชนีไว้ได้
  • TRUNCATE เร็วกว่าลบ

ลบ

ในการดำเนินการคิว DELETE จำเป็นต้องมีการอนุญาตให้ลบในตารางเป้าหมาย หากคุณต้องการใช้ WHERE clause ใน DELETE จำเป็นต้องเลือกการอนุญาตเช่นกัน

  • DELETE เป็นคำสั่ง DML
  • DELETE ดำเนินการโดยใช้การล็อคแถวแต่ละแถวในตารางจะถูกล็อคเพื่อลบ
  • เราสามารถใช้ที่ส่วนคำสั่งกับ DELETE เพื่อกรองและลบระเบียนที่เฉพาะเจาะจง
  • คำสั่ง DELETE ใช้เพื่อลบแถวออกจากตารางตามเงื่อนไข WHERE
  • มันดูแลบันทึกดังนั้นมันช้ากว่า TRUNCATE
  • คำสั่ง DELETE ลบแถวทีละครั้งและบันทึกรายการในบันทึกธุรกรรมสำหรับแต่ละแถวที่ถูกลบ
  • ข้อมูลประจำตัวของคอลัมน์ให้ DELETE เก็บข้อมูลประจำตัว
  • ในการใช้ Delete คุณต้องได้รับอนุญาต DELETE บนโต๊ะ
  • Delete ใช้พื้นที่การทำธุรกรรมมากกว่าคำสั่ง Truncate
  • การลบสามารถใช้กับมุมมองที่จัดทำดัชนี

5

หากคุณลบข้อมูลทั้งหมดออกจากตารางโดยไม่ตั้งใจโดยใช้ 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 กำลังเกิดขึ้น


1
ขอบคุณ @Lucas: เขาเน้นเนื้อหา ฉันแค่ใส่ไว้ในบล็อกสี่เหลี่ยมเพื่อให้ชัดเจนว่ามันมาจากแหล่งที่แตกต่าง
AstroCB

4

ใน SQL Server 2005 ฉันเชื่อว่าคุณสามารถย้อนกลับการตัดทอน


4

ลบ

คำสั่ง 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


นี่เป็นการเพิ่มคำตอบปัจจุบันหรือไม่?
David Aldridge

3

TRUNCATE สามารถย้อนกลับได้หากห่อในการทำธุรกรรม

โปรดดูข้อมูลอ้างอิงทั้งสองด้านล่างและทดสอบด้วยตนเอง: -

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE vs. DELETE เป็นหนึ่งในคำถามที่น่าอับอายระหว่างการสัมภาษณ์ SQL เพียงให้แน่ใจว่าคุณอธิบายให้ถูกต้องกับผู้สัมภาษณ์ไม่เช่นนั้นคุณอาจเสียค่าใช้จ่าย ปัญหาคือมีคนไม่มากนักที่รู้ว่าพวกเขาจะพิจารณาคำตอบว่าผิดถ้าคุณบอกพวกเขาว่าสามารถตัดทอน YES ได้


2

การแก้ไขเพียงเล็กน้อยสำหรับคำตอบดั้งเดิม - การลบยังสร้างการทำซ้ำจำนวนมาก (เนื่องจากการยกเลิกการป้องกันจะถูกทำซ้ำโดยการทำซ้ำ) สิ่งนี้สามารถเห็นได้จากเอาต์พุตอัตโนมัติ:

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

เธรดเก่า แต่ตามความเข้าใจของฉันจะตัดทอนเฉพาะจำนวนการบันทึกซ้ำที่ดีซึ่งการลบสร้างเลิกทำและทำซ้ำทั้งคู่
Saurabh Sinha

2

นี่คือคำตอบโดยละเอียดของฉันเกี่ยวกับความแตกต่างระหว่าง 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 ที่อ้างถึงตัวมันเอง


สวัสดี Mangal - ขอบคุณสำหรับคำตอบโดยเฉพาะอย่างยิ่งสำหรับปัญหาเฉพาะของ SQL * Server คุณคิดว่าคุณสามารถรวมคะแนนเหล่านั้นเข้ากับคำตอบของ Community Wiki ที่ได้รับการยอมรับหรือไม่?
David Aldridge

ใช่แน่นอน แต่อย่างไรและที่ไหน ขอโทษฉันใหม่ที่นี่
Mangal Pardeshi

"ดังนั้นหากคุณต้องการDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
เก็บตัว

1

ความแตกต่างที่ใหญ่ที่สุดคือการตัดทอนไม่ใช่การดำเนินการบันทึกในขณะที่การลบคือ

เพียงหมายความว่าในกรณีที่ฐานข้อมูลขัดข้องคุณไม่สามารถกู้คืนข้อมูลที่ดำเนินการโดยการตัดทอน แต่ด้วยการลบที่คุณสามารถทำได้

รายละเอียดเพิ่มเติมที่นี่


1

คำสั่ง DELETE: คำสั่งนี้จะลบเฉพาะแถวออกจากตารางโดยยึดตามเงื่อนไขที่กำหนดไว้ในส่วนคำสั่งหรือลบแถวทั้งหมดออกจากตารางหากไม่มีการระบุเงื่อนไข แต่มันจะไม่เพิ่มพื้นที่ว่างที่มีอยู่ในตาราง

ไวยากรณ์ของคำสั่ง SQL DELETE คือ:

ลบจาก table_name [เงื่อนไข WHERE];

คำสั่ง TRUNCATE: คำสั่งนี้ใช้เพื่อลบแถวทั้งหมดออกจากตารางและเพิ่มพื้นที่ว่างที่มีตาราง


1

ลบ

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

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


0

กล่าวโดยย่อการตัดจะไม่บันทึกสิ่งใด (เร็วกว่ามาก แต่ไม่สามารถยกเลิกได้) ในขณะที่การลบถูกบันทึกไว้ (และอาจเป็นส่วนหนึ่งของธุรกรรมที่มีขนาดใหญ่กว่าจะย้อนกลับเป็นต้น) หากคุณมีข้อมูลที่คุณไม่ต้องการในตารางใน dev โดยปกติแล้วจะดีกว่าที่จะตัดทอนเนื่องจากคุณไม่เสี่ยงต่อการกรอกบันทึกการทำธุรกรรม


0

เหตุผลใหญ่ที่มีประโยชน์คือเมื่อคุณต้องการรีเฟรชข้อมูลในตารางหลายล้านแถว แต่ไม่ต้องการสร้างใหม่ "Delete *" จะใช้เวลาตลอดไปในขณะที่ผลกระทบของ Truncate จะไม่สำคัญ


0

ไม่สามารถทำ DDL ผ่าน dblink ได้


0

ฉันจะแสดงความคิดเห็นในโพสต์ของ matthieu แต่ฉันยังไม่มีตัวแทน ...

ใน MySQL ตัวนับการเพิ่มอัตโนมัติจะถูกรีเซ็ตด้วยการตัดทอน แต่ไม่ใช่ด้วยการลบ


0

ไม่ใช่ว่า truncate จะไม่บันทึกสิ่งใดใน SQL Server truncate ไม่ได้บันทึกข้อมูลใด ๆ แต่จะบันทึกการยกเลิกการจัดสรรหน้าข้อมูลสำหรับตารางที่คุณเรียกใช้ TRUNCATE

และเร็กคอร์ดที่ถูกตัดทอนสามารถย้อนกลับได้ถ้าเรากำหนดธุรกรรมที่จุดเริ่มต้นและเราสามารถกู้คืนเร็กคอร์ดที่ถูกตัดทอนได้หลังจากย้อนกลับ แต่ไม่สามารถกู้คืนเร็กคอร์ดที่ถูกตัดทอนจากการสำรองข้อมูลล็อกธุรกรรมหลังจากทำธุรกรรมที่ถูกตัดทอน


0

การตัดทอนสามารถย้อนกลับไปที่ exapmle ได้ที่นี่

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

ตัดและลบใน SQL เป็นสองคำสั่งที่ใช้ในการลบหรือลบข้อมูลจากตาราง แม้ว่าพื้นฐานค่อนข้างเป็นธรรมชาติทั้งคำสั่ง Sql สามารถสร้างปัญหามากมายจนกว่าคุณจะคุ้นเคยกับรายละเอียดก่อนที่จะใช้ ตัวเลือกคำสั่งที่ไม่ถูกต้องอาจส่งผลให้เกิดกระบวนการที่ช้ามากหรืออาจทำให้เกิดปัญหาเซ็กเมนต์ท่อนข้อมูลถ้าจำเป็นต้องลบข้อมูลมากเกินไปและเซ็กเมนต์บันทึกไม่เพียงพอ ด้วยเหตุนี้จึงเป็นเรื่องสำคัญที่จะต้องรู้ว่าเมื่อใดที่จะใช้คำสั่ง truncate และ delete ใน SQL แต่ก่อนที่จะใช้สิ่งเหล่านี้คุณควรทราบถึงความแตกต่างระหว่าง Truncate และ Delete และจากนั้นเราควรจะทราบได้เมื่อ DELETE data หรือ TRUNCATE ควรใช้เพื่อล้างตาราง

ดูรายละเอียดคลิกที่นี่


0

โดยการออกคำสั่ง TRUNCATE TABLE คุณกำลังสั่งให้ SQL Server ลบทุก ๆ ระเบียนภายในตารางโดยไม่ต้องมีการบันทึกหรือการประมวลผลธุรกรรม


0

คำสั่ง DELETE สามารถมี WHERE clause เพื่อลบเร็กคอร์ดที่ระบุในขณะที่คำสั่ง TRUNCATE ไม่ต้องการอะไรและเช็ดทั้งตาราง ที่สำคัญคำสั่ง DELETE บันทึกวันที่ถูกลบในขณะที่คำสั่ง TRUNCATE ไม่


0

ความแตกต่างอีกประการหนึ่งสำหรับเซิร์ฟเวอร์ microsoft sql คือdeleteคุณสามารถใช้outputคำสั่งเพื่อติดตามว่าข้อมูลใดที่ถูกลบไปเช่น:

delete from [SomeTable]
output deleted.Id, deleted.Name

truncateคุณไม่สามารถทำเช่นนี้กับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.