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.
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
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:
DELETEFROM employees_temp
WHERE employee_id =299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
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) |
+----------------------------------------+----------------------------------------------+
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.
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.
TRUNCATEadalah pernyataan DDL sedangkan DELETEpernyataan DML. Berikut adalah perbedaan antara keduanya:
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.
TRUNCATEselalu menghapus semua baris dari tabel, membiarkan tabel kosong dan struktur tabel tetap utuh sedangkan DELETEdapat menghapus kondisional jika klausa mana digunakan.
Baris yang dihapus oleh TRUNCATE TABLEpernyataan tidak dapat dipulihkan dan Anda tidak bisa menentukan klausa di mana dalam TRUNCATEpernyataan.
TRUNCATEpernyataan tidak memicu pemicu yang bertentangan dengan pemicu hapus pada DELETEpernyataan
Inilah tautan yang sangat bagus yang relevan dengan topik tersebut.
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.
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.
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.
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.
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.
Koreksi kecil pada jawaban awal - hapus juga menghasilkan sejumlah besar pengulangan (karena undo sendiri dilindungi oleh pengulangan). Ini bisa dilihat dari output autotrace:
SQL>deletefrom t1;10918rows deleted.
Elapsed:00:00:00.58
Execution Plan----------------------------------------------------------0DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)10DELETEOF'T1'21TABLE 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)10918rows processed
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.
• 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.
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 bigintSET @ai =IDENT_CURRENT('tablename')TRUNCATE TABLE tablenameDBCC 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.
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.
DELETEis a DML command
DELETE you can rollbackDelete= Only Delete- so it can be rolled back
InDELETE you can write conditions usingWHERE clause
Syntax –Deletefrom[Table]where[Condition]
MEMOTONG
TRUNCATEis 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)inTRUNCATE
Syntax –Truncatetable[Table]
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.
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
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.
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.
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.
Dengan mengeluarkan pernyataan TRUNCATE TABLE, Anda menginstruksikan SQL Server untuk menghapus setiap catatan dalam sebuah tabel, tanpa terjadi pencatatan atau proses transaksi.
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.
Satu lagi perbedaan khusus untuk server microsoft sql adalah dengan deleteAnda dapat menggunakan outputpernyataan untuk melacak catatan apa yang telah dihapus, misalnya:
Jawaban:
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,
DELETE
pernyataan dapat kembali ke klien baris yang telah dihapus.misalnya dalam subprogram Oracle PL / SQL Anda dapat:
sumber
Perbedaan antara truncate dan delete tercantum di bawah ini:
sumber
Dari: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
sumber
Semua jawaban bagus, yang harus saya tambahkan:
Karena
TRUNCATE TABLE
merupakan DDL ( Data Defination Language ), bukan perintah DML ( Data Manipulation Langauge ),Delete Triggers
jangan dijalankan.sumber
Ringkasan Delete Vs Truncate di SQL server
Untuk Artikel Lengkap ikuti tautan ini: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Diambil dari artikel dotnet mob: Hapus Vs Truncate di SQL Server
sumber
Dengan SQL Server atau MySQL, jika ada PK dengan kenaikan otomatis, truncate akan mengatur ulang penghitung.
sumber
DBCC CHECKIDENT (table_name, RESEED, 1)
"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.
sumber
TRUNCATE
adalah pernyataan DDL sedangkanDELETE
pernyataan DML. Berikut adalah perbedaan antara keduanya:Seperti
TRUNCATE
pernyataan 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 lainDELETE
adalah pernyataan DML ( Data manipulation language ) karenanya memerlukan komitmen eksplisit untuk membuat efeknya permanen.TRUNCATE
selalu menghapus semua baris dari tabel, membiarkan tabel kosong dan struktur tabel tetap utuh sedangkanDELETE
dapat menghapus kondisional jika klausa mana digunakan.Baris yang dihapus oleh
TRUNCATE TABLE
pernyataan tidak dapat dipulihkan dan Anda tidak bisa menentukan klausa di mana dalamTRUNCATE
pernyataan.TRUNCATE
pernyataan tidak memicu pemicu yang bertentangan dengan pemicu hapus padaDELETE
pernyataanInilah tautan yang sangat bagus yang relevan dengan topik tersebut.
sumber
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.
sumber
MEMOTONG
TRUNCATE Permintaan SQL menghapus semua baris dari tabel, tanpa mencatat penghapusan baris individu.
MENGHAPUS
Untuk menjalankan antrian DELETE, izin penghapusan diperlukan pada tabel target. Jika Anda perlu menggunakan klausa WHERE di DELETE, izin pilih juga diperlukan.
sumber
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 :
sumber
Dalam SQL Server 2005 saya percaya bahwa Anda dapat mengembalikan truncate
sumber
Dari: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
sumber
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.
sumber
Koreksi kecil pada jawaban awal - hapus juga menghasilkan sejumlah besar pengulangan (karena undo sendiri dilindungi oleh pengulangan). Ini bisa dilihat dari output autotrace:
sumber
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.
sumber
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
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
sumber
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.
sumber
MENGHAPUS
MEMOTONG
Untuk lebih jelasnya kunjungi
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
sumber
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.
sumber
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
sumber
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.
sumber
Tidak dapat melakukan DDL melalui dblink.
sumber
Saya akan mengomentari posting matthieu, tapi saya belum memiliki perwakilan ...
Di MySQL, penghitung kenaikan otomatis akan diatur ulang dengan truncate, tetapi tidak dengan delete.
sumber
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.
sumber
Memotong juga dapat Rollbacked di sini contohnya
sumber
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
sumber
Dengan mengeluarkan pernyataan TRUNCATE TABLE, Anda menginstruksikan SQL Server untuk menghapus setiap catatan dalam sebuah tabel, tanpa terjadi pencatatan atau proses transaksi.
sumber
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.
sumber
Satu lagi perbedaan khusus untuk server microsoft sql adalah dengan
delete
Anda dapat menggunakanoutput
pernyataan untuk melacak catatan apa yang telah dihapus, misalnya:Anda tidak dapat melakukan ini dengan
truncate
.sumber