Apa perbedaan antara TRUNCATE dan DELETE dalam SQL

303

Apa perbedaan antara TRUNCATEdan DELETEdalam SQL?

Jika jawaban Anda spesifik untuk platform, harap tunjukkan itu.

David Aldridge
sumber
4
Semua jawaban adalah khusus untuk platform. Tidak ada perintah TRUNCATE dalam SQL standar. Oleh karena itu, ini adalah fitur eksklusif dan memiliki arti berbeda untuk setiap vendor DBMS.
nvogel
Jawabannya sangat spesifik untuk implementasi, karena seperti yang ditunjukkan sqlvogel, ini adalah perintah non-standar (TRUNCATE). Baik tinggalkan yang ditandai ini 'oracle' atau mari kita jadikan ini gaya komunitas-wiki, dan berikan konsekuensi untuk setiap RDBMS utama (Oracle, MS-MSQL, PostgreSQL semuanya mengimplementasikan TRUNCATE ...)
reedstrm
Jika Transaksi selesai, berarti KOMITE, maka kami tidak dapat mengembalikan perintah TRUNCATE, tetapi kami masih dapat mengembalikan perintah DELETE dari file LOG, karena DELETE menulisnya dalam file Log jika diperlukan untuk mengembalikan file LOG di masa mendatang.

Jawaban:

272

Berikut daftar perbedaannya. Saya telah menyoroti fitur khusus Oracle, dan semoga komunitas dapat menambahkan perbedaan spesifik vendor lain juga. Perbedaan yang umum bagi sebagian besar vendor dapat langsung di bawah judul, dengan perbedaan yang disorot di bawah ini.


Gambaran umum

Jika Anda ingin menghapus semua baris dengan cepat dari sebuah tabel, dan Anda benar-benar yakin ingin melakukannya, dan Anda tidak memiliki kunci asing terhadap tabel, maka TRUNCATE mungkin akan lebih cepat daripada HAPUS .

Berbagai masalah khusus sistem harus dipertimbangkan, seperti dirinci di bawah ini.


Jenis pernyataan

Hapus adalah DML, Truncate adalah DDL ( Apa itu DDL dan DML? )


Komit dan Kembalikan

Variabel berdasarkan vendor

SQL * Server

Memotong dapat digulung kembali.

PostgreSQL

Memotong dapat digulung kembali.

Peramal

Karena TRUNCATE adalah DDL, itu melibatkan dua komit, satu sebelum dan satu setelah eksekusi pernyataan. Oleh karena itu truncate tidak dapat digulung kembali, dan kegagalan dalam proses truncate akan mengeluarkan komit.

Namun, lihat Kilas Balik di bawah ini.


Reklamasi ruang

Hapus tidak memulihkan ruang, Truncate memulihkan ruang

Peramal

Jika Anda menggunakan klausa REUSE STORAGE maka segmen data tidak dialokasikan, yang sedikit lebih efisien jika tabel diisi ulang dengan data. Tanda air tinggi diatur ulang.


Lingkup baris

Hapus dapat digunakan untuk menghapus semua baris atau hanya sebagian dari baris. Truncate menghapus semua baris.

Peramal

Ketika sebuah tabel dipartisi, partisi individual dapat terpotong secara terpisah, dengan demikian sebagian penghapusan semua data tabel dimungkinkan.


Jenis objek

Hapus bisa diterapkan ke tabel dan tabel di dalam sebuah cluster. Truncate hanya berlaku untuk tabel atau seluruh cluster. (Mungkin spesifik Oracle)


Identitas Objek Data

Peramal

Hapus tidak memengaruhi id objek data, tetapi truncate memberikan id objek data baru kecuali jika tidak pernah ada sisipan terhadap tabel sejak pembuatannya. Bahkan satu insert yang digulirkan kembali akan menyebabkan id objek data baru ditetapkan pada pemotongan. .


Kilas balik (Oracle)

Kilas balik berfungsi di seluruh penghapusan, tetapi truncate mencegah kilas balik ke status sebelum operasi.

Namun, dari 11gR2 fitur FLASHBACK ARCHIVE memungkinkan ini, kecuali dalam Express Edition

Penggunaan FLASHBACK di Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Hak istimewa

Variabel

Peramal

Hapus dapat diberikan pada tabel ke pengguna atau peran lain, tetapi truncate tidak dapat dilakukan tanpa menggunakan DROP ANY TABLE grant.


Redo / Undo

Hapus menghasilkan sejumlah kecil pengulangan dan sejumlah besar penguraian. Truncate menghasilkan jumlah masing-masing yang dapat diabaikan.


Indeks

Peramal

Operasi terpotong membuat indeks tidak dapat digunakan lagi. Hapus tidak.


Kunci Asing

Truncate tidak dapat diterapkan ketika kunci asing yang diaktifkan merujuk pada tabel. Perawatan dengan delete tergantung pada konfigurasi kunci asing.


Mengunci Meja

Peramal

Truncate memerlukan kunci tabel eksklusif, hapus membutuhkan kunci tabel bersama. Oleh karena itu menonaktifkan kunci meja adalah cara untuk mencegah operasi terpotong di atas meja.


Pemicu

Pemicu DML tidak menyala pada truncate.

Peramal

Tersedia pemicu DDL.


Eksekusi Jarak Jauh

Peramal

Truncate tidak dapat dikeluarkan melalui tautan basis data.


Kolom Identitas

SQL * Server

Truncate me-reset urutan untuk jenis kolom IDENTITY, hapus tidak.


Hasil ditetapkan

Di sebagian besar implementasi, DELETEpernyataan dapat kembali ke klien baris yang telah dihapus.

misalnya dalam subprogram Oracle PL / SQL Anda dapat:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
David Aldridge
sumber
Tidak mengerti pernyataan ke-4 Anda: jika saya katakan DELETE [ ] FROM Table; maka * semua baris dalam tabel itu akan dihapus kecuali jika FK menghentikannya. Omong-omong, saya kira ini khusus untuk SQL Server, Anda tidak bisa menggunakan TRUNCATE pada tabel dengan FK.
Joe Pineda
Beberapa komentar lagi: Saya tidak setuju dengan pernyataan ke-3 Anda, kecuali itu spesifik Oracle. Setidaknya dengan SQL S. baik jika Anda HAPUS atau TRUNCATE Anda tidak memulihkan ruang (yaitu file database tidak menyusut pada hard drive) kecuali Anda secara khusus memintanya.
Joe Pineda
1
Pernyataan 5TH: Anda dapat mengembalikan TRUNCATE TABLE pada sql 2008 r2
Eric Labashosky
1
Postgresql dapat mengembalikan TRUNCATE dan karenanya juga tidak memutus komitnya.
rfusca
5
HAPUS mengembalikan jumlah baris yang dihapus, tetapi TRUNCATE tidak. Ini adalah poin yang sangat konyol tetapi layak untuk disebutkan :)
Deepak Kumar Jha
191

Perbedaan antara truncate dan delete tercantum di bawah ini:

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+
Bhaumik Patel
sumber
Truncate reset identity of table Apa artinya? Tapi, Bagaimana dengan Delete?
Ravi
1
@ jWeaver: Ini berarti ketika Anda mengatur properti Spesifikasi Identitas ke bidang True untuk kunci Utama, jadi ketika Anda memasukkan data ke dalam tabel itu, kolom kunci utama menyimpan nilai seperti 1,2,3,4,5 .... (jika Identity dimulai dari 1 dan seed adalah 1), dan ketika Anda memotong tabel itu akan kehilangan semua nilai identitas, jadi ketika Anda mulai memasukkan data ke dalam tabel itu lagi itu akan mulai dari 1 alih-alih dari tempat terakhir. Di DELETE, itu terbalik, mempertahankan nilai identitas bahkan setelah Anda menjalankan pernyataan DELETE. Maaf untuk kesalahan titik perbandingan 2 di kolom DELETE pada gambar di atas.
Bhaumik Patel
Sepertinya Anda menjawab untuk SQL SERVER
Ravi
4
Baik TRUNCATE dan DELETE dapat digulungKembali di SQL SERVER . Dan dalam baris DELETE dosis 2 tidak mengatur ulang identitas. Sekarang bagaimana Anda bisa mengedit posting ini? Itu hal buruk tentang menggunakan gambar di StackOverflow.
Mahmood Jenami
2
Truncate sedang diputar kembali! (SQL SERVER)
Aimal Khan
55

PENURUNAN

Perintah DROP menghapus tabel dari database. Semua baris, indeks, dan hak istimewa tabel juga akan dihapus. Tidak ada pemicu DML yang akan dipecat. Operasi tidak dapat dibatalkan.

MEMOTONG

TRUNCATE menghapus semua baris dari tabel. Operasi tidak dapat dibatalkan dan tidak ada pemicu yang akan diaktifkan. Dengan demikian, TRUNCATE lebih cepat dan tidak menggunakan ruang undo sebanyak DELETE. Kunci level tabel akan ditambahkan saat Memotong.

MENGHAPUS

Perintah DELETE digunakan untuk menghapus baris dari tabel. Klausa WHERE hanya bisa digunakan untuk menghapus beberapa baris. Jika tidak ada kondisi WHERE yang ditentukan, semua baris akan dihapus. Setelah melakukan operasi HAPUS, Anda perlu KOMIT atau ROLLBACK transaksi untuk membuat perubahan itu permanen atau membatalkannya. Perhatikan bahwa operasi ini akan menyebabkan semua pemicu DELETE di atas meja menyala. Kunci tingkat baris akan ditambahkan saat menghapus.

Dari: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Mohit Singh
sumber
5
Penjelasan yang bagus untuk pemula seperti saya
Vikas Kukreti
Singkat dan manis
ABH
23

Semua jawaban bagus, yang harus saya tambahkan:

Karena TRUNCATE TABLEmerupakan DDL ( Data Defination Language ), bukan perintah DML ( Data Manipulation Langauge ), Delete Triggersjangan dijalankan.

polara
sumber
Ah, pemicu ... itu poin yang bagus. Saya akan menambahkannya ke daftar yang saya buat dan memuji Anda Polara, jika tidak apa-apa.
David Aldridge
SQL Server tidak akan membiarkan Anda memotong tabel dengan kunci asing, jadi titik kaskade Anda bisa diperdebatkan, tergantung pada platform.
Meff
PostgreSQL memiliki "TRUNCATE Trigger"
a_horse_with_no_name
17

Dengan SQL Server atau MySQL, jika ada PK dengan kenaikan otomatis, truncate akan mengatur ulang penghitung.

mathieu
sumber
Untuk memperjelas, ini untuk SQL Server jika tabel memiliki kolom yang didefinisikan sebagai IDENTITAS. Hapus akan mempertahankan ID yang ditetapkan secara otomatis terakhir, sementara Truncate me-reset penghitung.
Codewerks
Karena pertanyaan ini ditandai ORACLE, maka jawaban ini SALAH, oleh karena itu tidak berlaku.
Guy
oops, tidak melihat tag oracle :)
mathieu
+1 benar, dan mengembalikannya ke 0 . Jika Anda ingin menjadi 1 sebagai gantinya:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB
Saya telah menambahkan ini ke dalam jawaban komunitas, dan membuatnya sedikit lebih ramah untuk mendokumentasikan masalah
David Aldridge
12

"Truncate tidak mencatat apa pun" sudah benar. Saya akan melangkah lebih jauh:

Truncate tidak dieksekusi dalam konteks transaksi.

Keuntungan kecepatan dari truncate over delete harus jelas. Keuntungan itu berkisar dari hal sepele hingga yang sangat besar, tergantung pada situasi Anda.

Namun, saya telah melihat truncate tanpa sengaja merusak integritas referensial, dan melanggar kendala lainnya. Kekuatan yang Anda peroleh dengan memodifikasi data di luar transaksi harus seimbang dengan tanggung jawab yang Anda warisi ketika Anda berjalan di atas tali tanpa jaring.

Walter Mitty
sumber
7

TRUNCATEadalah pernyataan DDL sedangkan DELETEpernyataan DML. Berikut adalah perbedaan antara keduanya:

  1. Seperti TRUNCATEpernyataan DDL ( Bahasa definisi data ), pernyataan ini tidak memerlukan komitmen untuk membuat perubahan permanen. Dan inilah alasan mengapa baris yang dihapus oleh truncate tidak dapat di-rollback. Di sisi lain DELETEadalah pernyataan DML ( Data manipulation language ) karenanya memerlukan komitmen eksplisit untuk membuat efeknya permanen.

  2. TRUNCATEselalu menghapus semua baris dari tabel, membiarkan tabel kosong dan struktur tabel tetap utuh sedangkan DELETEdapat menghapus kondisional jika klausa mana digunakan.

  3. Baris yang dihapus oleh TRUNCATE TABLEpernyataan tidak dapat dipulihkan dan Anda tidak bisa menentukan klausa di mana dalam TRUNCATEpernyataan.

  4. TRUNCATEpernyataan tidak memicu pemicu yang bertentangan dengan pemicu hapus pada DELETEpernyataan

Inilah tautan yang sangat bagus yang relevan dengan topik tersebut.

Sachin Chourasiya
sumber
6

Ya, HAPUS lebih lambat, TRUNCATE lebih cepat. Mengapa?

DELETE harus membaca catatan, memeriksa batasan, memperbarui blok, memperbarui indeks, dan menghasilkan redo / undo. Semua itu butuh waktu.

TRUNCATE hanya menyesuaikan pointer di database untuk tabel (Tanda Air Tinggi) dan poof! data hilang.

Ini spesifik untuk Oracle, AFAIK.

DCookie
sumber
PostgreSQL juga mirip dengan ini.
Gavin M. Roy
6

MEMOTONG

TRUNCATE Permintaan SQL menghapus semua baris dari tabel, tanpa mencatat penghapusan baris individu.

  • TRUNCATE adalah perintah DDL.
  • TRUNCATE dijalankan menggunakan kunci tabel dan seluruh tabel dikunci untuk menghapus semua catatan.
  • Kami tidak dapat menggunakan klausa WHERE dengan TRUNCATE.
  • TRUNCATE menghapus semua baris dari tabel.
  • Minimal logging dalam log transaksi, sehingga lebih cepat kinerja bijaksana.
  • TRUNCATE TABLE menghapus data dengan mendeallocating halaman data yang digunakan untuk menyimpan data tabel dan mencatat hanya deallocations halaman dalam log transaksi.
  • Untuk menggunakan Truncate pada tabel, Anda memerlukan setidaknya ALTER izin di atas meja.
  • Truncate menggunakan lebih sedikit ruang transaksi daripada pernyataan Hapus.
  • Truncate tidak dapat digunakan dengan tampilan yang diindeks.
  • TRUNCATE lebih cepat dari HAPUS.

MENGHAPUS

Untuk menjalankan antrian DELETE, izin penghapusan diperlukan pada tabel target. Jika Anda perlu menggunakan klausa WHERE di DELETE, izin pilih juga diperlukan.

  • DELETE adalah perintah DML.
  • HAPUS dijalankan menggunakan kunci baris, setiap baris dalam tabel dikunci untuk dihapus.
  • Kita dapat menggunakan klausa mana dengan DELETE untuk memfilter & menghapus catatan tertentu.
  • Perintah DELETE digunakan untuk menghapus baris dari tabel berdasarkan kondisi WHERE.
  • Itu memelihara log, jadi lebih lambat dari TRUNCATE.
  • Pernyataan DELETE menghapus baris satu per satu dan mencatat entri dalam log transaksi untuk setiap baris yang dihapus.
  • Identitas kolom menjaga DELETE mempertahankan identitas.
  • Untuk menggunakan Delete, Anda perlu HAPUS izin di atas meja.
  • Hapus menggunakan lebih banyak ruang transaksi daripada pernyataan Truncate.
  • Hapus dapat digunakan dengan tampilan yang diindeks.
Purvi Barot
sumber
5

Jika secara tidak sengaja Anda menghapus semua data dari tabel menggunakan Delete / Truncate. Anda dapat mengembalikan transaksi yang dilakukan. Kembalikan cadangan terakhir dan jalankan log transaksi hingga saat Hapus / Truncate akan terjadi.

Informasi terkait di bawah ini dari posting blog :

Saat bekerja pada basis data, kami menggunakan Delete dan Truncate tanpa mengetahui perbedaan di antara mereka. Pada artikel ini kita akan membahas perbedaan antara Hapus dan Potong dalam Sql.

Menghapus:

  • Hapus adalah perintah DML.
  • Pernyataan Hapus dijalankan menggunakan kunci baris, setiap baris dalam tabel dikunci untuk dihapus.
  • Kita dapat menentukan filter di mana klausa.
  • Ini menghapus data tertentu jika ada kondisi.
  • Hapus kegiatan pemicu karena operasi dicatat secara individual.
  • Lebih lambat daripada terpotong karena itu membuat log

Memotong

  • Truncate adalah perintah DDL.
  • Tabel terpotong selalu mengunci tabel dan halaman tetapi tidak setiap baris. Karena menghapus semua data.
  • Tidak dapat menggunakan kondisi Dimana.
  • Ini Menghapus semua data.
  • Tabel terpotong tidak dapat mengaktifkan pemicu karena operasi tidak mencatat penghapusan baris individual.
  • Lebih cepat dalam kinerja bijaksana, karena tidak menyimpan log.

Catatan: Hapus dan Truncate keduanya dapat diputar kembali saat digunakan dengan Transaksi. Jika Transaksi dilakukan, berarti dilakukan maka kita tidak dapat mengembalikan perintah Truncate, tetapi kita masih dapat mengembalikan perintah Hapus dari file Log, seperti menghapus catatan menulis mereka dalam file Log jika diperlukan untuk mengembalikan di masa depan dari file log.

Jika Anda memiliki batasan kunci Asing yang merujuk ke tabel yang Anda coba potong, ini tidak akan berfungsi bahkan jika tabel referensi tidak memiliki data di dalamnya. Ini karena pemeriksaan kunci asing dilakukan dengan DDL daripada DML. Ini dapat disiasati dengan menonaktifkan sementara batasan kunci asing untuk tabel.

Hapus tabel adalah operasi yang dicatat. Jadi penghapusan setiap baris akan dicatat dalam log transaksi, yang membuatnya lambat. Tabel truncate juga menghapus semua baris dalam sebuah tabel, tetapi itu tidak akan mencatat penghapusan setiap baris, melainkan mencatat deallokasi halaman data dari tabel, yang membuatnya lebih cepat.

~ Jika secara tidak sengaja Anda menghapus semua data dari tabel menggunakan Delete / Truncate. Anda dapat mengembalikan transaksi yang dilakukan. Kembalikan cadangan terakhir dan jalankan log transaksi hingga saat Hapus / Truncate akan terjadi.

wpzone4u
sumber
1
Terima kasih @Lucas: dia memberikan konten. Saya hanya meletakkannya di blockquote untuk membuatnya jelas bahwa itu dari sumber perbedaan.
AstroCB
4

Dalam SQL Server 2005 saya percaya bahwa Anda dapat mengembalikan truncate


sumber
4

MENGHAPUS

Perintah DELETE digunakan untuk menghapus baris dari tabel. Klausa WHERE hanya bisa digunakan untuk menghapus beberapa baris. Jika tidak ada kondisi WHERE yang ditentukan, semua baris akan dihapus. Setelah melakukan operasi HAPUS, Anda perlu KOMIT atau ROLLBACK transaksi untuk membuat perubahan itu permanen atau membatalkannya. Perhatikan bahwa operasi ini akan menyebabkan semua pemicu DELETE di atas meja menyala.

MEMOTONG

TRUNCATE menghapus semua baris dari tabel. Operasi tidak dapat dibatalkan dan tidak ada pemicu yang akan diaktifkan. Dengan demikian, TRUCATE lebih cepat dan tidak menggunakan ruang undo sebanyak DELETE.

PENURUNAN

Perintah DROP menghapus tabel dari database. Semua baris, indeks, dan hak istimewa tabel juga akan dihapus. Tidak ada pemicu DML yang akan dipecat. Operasi tidak dapat dibatalkan.


DROP dan TRUNCATE adalah perintah DDL, sedangkan DELETE adalah perintah DML. Oleh karena itu operasi DELETE dapat dibatalkan (dibatalkan), sementara operasi DROP dan TRUNCATE tidak dapat dibatalkan.

Dari: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

MyUserQuestion
sumber
Apakah ini menambahkan sesuatu ke jawaban saat ini?
David Aldridge
3

TRUNCATE dapat dibatalkan jika dibungkus dalam suatu transaksi.

Silakan lihat dua referensi di bawah ini dan uji diri Anda: -

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 adalah salah satu pertanyaan terkenal selama wawancara SQL. Pastikan Anda menjelaskannya dengan baik kepada Pewawancara atau mungkin akan dikenakan biaya untuk pekerjaan itu. Masalahnya adalah tidak banyak yang sadar sehingga kemungkinan besar mereka akan menganggap jawabannya salah jika Anda memberi tahu mereka bahwa YA Truncate dapat dibatalkan.

SQLnbe
sumber
2

Koreksi kecil pada jawaban awal - hapus juga menghasilkan sejumlah besar pengulangan (karena undo sendiri dilindungi oleh pengulangan). Ini bisa dilihat dari output autotrace:

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
CaptainPicard
sumber
utasnya yang lama tetapi sesuai pemahaman saya, truncate hanya menghasilkan jumlah yang baik dari redo log di mana sebagai delete menghasilkan undo dan redo keduanya.
Saurabh Sinha
2

Inilah jawaban terperinci saya tentang perbedaan antara HAPUS dan TRUNCATE di SQL Server

Hapus Data : Hal pertama yang pertama, keduanya dapat digunakan untuk menghapus baris dari tabel.
Tetapi DELETE dapat digunakan untuk menghapus baris tidak hanya dari Tabel tetapi juga dari VIEW atau hasil OPENROWSET atau OPENQUERY tergantung pada kemampuan penyedia.

FROM Clause : Dengan DELETE Anda juga dapat menghapus baris dari satu tabel / view / rowset_function_limited berdasarkan baris dari tabel lain dengan menggunakan klausa FROM lainnya. Dalam klausa FROM itu, Anda juga dapat menulis kondisi GABUNGAN normal. Sebenarnya Anda bisa membuat pernyataan DELETE dari pernyataan SELECT yang tidak mengandung fungsi agregat dengan mengganti SELECT dengan DELETE dan menghapus nama kolom.
Dengan TRUNCATE Anda tidak bisa melakukan itu.

DIMANA : TRUNCATE tidak dapat memiliki Ketentuan WHERE, tetapi DELETE bisa. Itu berarti dengan TRUNCATE Anda tidak dapat menghapus baris tertentu atau grup baris tertentu. TRUNCATE TABLE mirip dengan pernyataan DELETE tanpa klausa WHERE.

Kinerja : TRUNCATE TABLE lebih cepat dan menggunakan lebih sedikit sumber daya sistem dan log transaksi. Dan salah satu alasannya adalah kunci yang digunakan oleh salah satu pernyataan. Pernyataan DELETE dijalankan menggunakan kunci baris, setiap baris dalam tabel dikunci untuk dihapus. TRUNCATE TABLE selalu mengunci tabel dan halaman tetapi tidak setiap baris.

Log transaksi : HAPUS pernyataan menghapus baris satu per satu dan membuat entri individual dalam log transaksi untuk setiap baris.
TRUNCATE TABLE menghapus data dengan mendeallocating halaman data yang digunakan untuk menyimpan data tabel dan hanya mencatat deallocations halaman dalam log transaksi.

Halaman : Setelah pernyataan DELETE dijalankan, tabel masih dapat berisi halaman kosong. TRUNCATE menghapus data dengan deallocating halaman data yang digunakan untuk menyimpan data tabel.

Pemicu : TRUNCATE tidak mengaktifkan pemicu penghapusan di atas meja. Jadi, Anda harus sangat berhati-hati saat menggunakan TRUNCATE. Seseorang seharusnya tidak pernah menggunakan TRUNCATE jika menghapus Pemicu didefinisikan pada tabel untuk melakukan beberapa pembersihan otomatis atau tindakan logging ketika baris dihapus.

Kolom Identitas : Dengan TRUNCATE jika tabel berisi kolom identitas, penghitung untuk kolom itu diatur ulang ke nilai seed yang ditentukan untuk kolom. Jika tidak ada seed yang didefinisikan, nilai default 1 digunakan. DELETE tidak mengatur ulang penghitung identitas. Jadi, jika Anda ingin mempertahankan penghitung identitas, gunakan DELETE sebagai gantinya.

Replikasi : DELETE dapat digunakan terhadap tabel yang digunakan dalam replikasi transaksional atau penggabungan replikasi.
Sementara TRUNCATE tidak dapat digunakan terhadap tabel yang terlibat dalam replikasi transaksional atau menggabungkan replikasi.

Kembalikan : Pernyataan DELETE dapat dibatalkan.
TRUNCATE juga dapat diputar kembali asalkan tertutup dalam blok TRANSAKSI dan sesi tidak ditutup. Setelah sesi ditutup, Anda tidak akan dapat melakukan Rollback TRUNCATE.

Pembatasan : Pernyataan DELETE mungkin gagal jika melanggar pemicu atau mencoba untuk menghapus baris yang dirujuk oleh data dalam tabel lain dengan kendala KUNCI ASING. Jika DELETE menghapus banyak baris, dan salah satu baris yang dihapus melanggar pemicu atau kendala, pernyataan dibatalkan, kesalahan dikembalikan, dan tidak ada baris dihapus.
Dan jika DELETE digunakan terhadap View, View itu haruslah tampilan yang dapat diupdate. TRUNCATE tidak dapat digunakan terhadap tabel yang digunakan dalam tampilan Terindeks.
TRUNCATE tidak dapat digunakan terhadap tabel yang dirujuk oleh batasan KUNCI ASING, kecuali sebuah tabel yang memiliki kunci asing yang mereferensikan dirinya sendiri.

Mangal Pardeshi
sumber
Hai Mangal - terima kasih atas jawabannya, terutama untuk masalah khusus SQL * Server. Apakah Anda pikir Anda dapat mengintegrasikan poin-poin itu dengan jawaban Wiki Komunitas yang diterima?
David Aldridge
Ya tentu, tapi bagaimana dan di mana? Maaf saya baru di sini.
Mangal Pardeshi
"Jadi, jika Anda ingin mempertahankan penghitung identitas, gunakan DELETE" bisakah Anda menggunakanDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag
1

Perbedaan terbesar adalah bahwa truncate adalah operasi yang tidak dicatat sedangkan delete adalah.

Sederhananya itu berarti bahwa dalam kasus database crash, Anda tidak dapat memulihkan data yang dioperasikan oleh truncate tetapi dengan delete Anda bisa.

Lebih detail di sini

Belajar
sumber
1

HAPUS Pernyataan: Perintah ini hanya menghapus baris dari tabel berdasarkan kondisi yang diberikan di mana klausa atau menghapus semua baris dari tabel jika tidak ada kondisi yang ditentukan. Tapi itu tidak membebaskan ruang yang berisi tabel.

Sintaks pernyataan SQL DELETE adalah:

HAPUS DARI table_name [kondisi WHERE];

Pernyataan TRUNCATE: Perintah ini digunakan untuk menghapus semua baris dari tabel dan membebaskan ruang yang berisi tabel.

Bhushan Patil
sumber
1

MENGHAPUS

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]

MEMOTONG

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]

Untuk lebih jelasnya kunjungi

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/

pengguna27332
sumber
1

Satu perbedaan lebih lanjut dari dua operasi adalah bahwa jika tabel berisi kolom identitas, penghitung untuk kolom itu diatur ulang 1 (atau ke nilai seed yang ditentukan untuk kolom) di bawah TRUNCATE. HAPUS tidak memiliki pengaruh ini.

sebelah barat
sumber
0

Singkatnya, truncate tidak mencatat apa pun (jadi jauh lebih cepat tetapi tidak dapat dibatalkan) sedangkan delete dicatat (dan dapat menjadi bagian dari transaksi yang lebih besar, akan dikembalikan, dll). Jika Anda memiliki data yang tidak Anda inginkan dalam tabel di dev, biasanya lebih baik terpotong karena Anda tidak berisiko mengisi log transaksi

Oskar
sumber
0

Alasan utama yang praktis, adalah ketika Anda perlu me-refresh data dalam tabel baris multi-juta, tetapi tidak ingin membangunnya kembali. "Hapus *" akan berlangsung selamanya, sedangkan dampak kinerja Truncate akan diabaikan.

Jordan Ogren
sumber
0

Tidak dapat melakukan DDL melalui dblink.


sumber
0

Saya akan mengomentari posting matthieu, tapi saya belum memiliki perwakilan ...

Di MySQL, penghitung kenaikan otomatis akan diatur ulang dengan truncate, tetapi tidak dengan delete.

nathan
sumber
0

Bukan berarti truncate tidak mencatat apa pun di SQL Server. truncate tidak mencatat informasi apa pun tetapi mencatat deallokasi halaman data untuk tabel tempat Anda memecat TRUNCATE.

dan catatan terpotong bisa menjadi rollback jika kita mendefinisikan transaksi di awal dan kita dapat memulihkan catatan terpotong setelah rollback itu. Tetapi tidak dapat memulihkan catatan terpotong dari cadangan log transaksi setelah transaksi terpotong berkomitmen.

pengguna2587360
sumber
0

Memotong juga dapat Rollbacked di sini contohnya

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
Vinay Pandit
sumber
0

Truncate dan Delete dalam SQL adalah dua perintah yang digunakan untuk menghapus atau menghapus data dari tabel. Meskipun sifatnya cukup mendasar kedua perintah Sql dapat menciptakan banyak masalah sampai Anda terbiasa dengan detail sebelum menggunakannya. Pilihan perintah yang salah dapat mengakibatkan proses yang sangat lambat atau bahkan dapat meledakan segmen log, jika terlalu banyak data yang perlu dihapus dan segmen log tidak cukup. Itu sebabnya sangat penting untuk mengetahui kapan harus menggunakan perintah truncate dan delete dalam SQL tetapi sebelum menggunakan ini Anda harus mengetahui Perbedaan antara Truncate dan Delete, dan berdasarkan pada mereka, kita harus dapat mengetahui kapan DELETE adalah pilihan yang lebih baik untuk menghapus data atau TRUNCATE harus digunakan untuk membersihkan tabel.

Lihat cek klik di sini

wpzone4u
sumber
0

Dengan mengeluarkan pernyataan TRUNCATE TABLE, Anda menginstruksikan SQL Server untuk menghapus setiap catatan dalam sebuah tabel, tanpa terjadi pencatatan atau proses transaksi.

Gerald
sumber
0

Pernyataan HAPUS dapat memiliki klausa WHERE untuk menghapus catatan tertentu sedangkan pernyataan TRUNCATE tidak memerlukan dan menghapus seluruh tabel. Yang penting, pernyataan DELETE mencatat tanggal yang dihapus sedangkan pernyataan TRUNCATE tidak.

Ali
sumber
0

Satu lagi perbedaan khusus untuk server microsoft sql adalah dengan deleteAnda dapat menggunakan outputpernyataan untuk melacak catatan apa yang telah dihapus, misalnya:

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

Anda tidak dapat melakukan ini dengan truncate.

Mykhailo Seniutovych
sumber