DELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing

  1. Beranda
  2. Blog
  3. Database & SQL

Database & SQL

DELETE vs TRUNCATE vs DROP: Perbedaan, Rollback, dan Kapan Menggunakan Masing-Masing

Ketiga perintah tersebut menghapus sesuatu, tetapi mereka menghapus hal yang berbeda dengan cara yang berbeda. Inilah yang dilakukan masing-masing database, apa yang dapat Anda batalkan, dan bagaimana aturan berubah antar database.

8 menit baca
HAPUS vs TRUNCATE vs DROP dalam SQL: perbedaan, rollback dan kapan menggunakan masing-masing

Poin penting

  • DELETE menghapus baris, secara opsional difilter dengan WHERE. Mejanya tetap ada.
  • TRUNCATE menghapus semua baris dengan cepat. Struktur tabel tetap ada.
  • DROP menghapus seluruh tabel: data, struktur, indeks, dan pemicu.
  • Rollback, pemicu, dan penyetelan ulang identitas berperilaku berbeda di setiap database, jadi periksa milik Anda.

Seorang penguji ingin menghapus tabel pementasan sebelum pengujian baru dijalankan. Haruskah DELETE, TRUNCATE atau DROP? Pilihan yang salah bisa berarti pekerjaan lambat, meja hilang, atau, dalam produksi, sore yang sangat buruk.

Kami menjalankan contoh DELETE dan DROP di bawah ini di SQLite 3.50, dan output berasal dari proses tersebut. SQLite tidak memiliki perintah TRUNCATE, jadi catatan TRUNCATE didasarkan pada dokumentasi resmi PostgreSQL, MySQL, dan SQL Server, bukan pengujian kami sendiri.

Jawaban singkatnya

  • Perlu menghapus beberapa baris? Gunakan DELETE ... WHERE.
  • Perlu mengosongkan meja tetapi tetap menyimpannya? Gunakan TRUNCATE, jika didukung.
  • Perlu mejanya dihilangkan selamanya? Gunakan DROP TABLE.

HAPUS: menghapus baris

DELETE adalah perintah perubahan data (DML). Ini menghapus baris satu per satu, mengaktifkan pemicu tingkat baris dan dapat difilter. Kami menyiapkan tabel kecil dengan pemicu audit:

CREATE TABLE logs (id INTEGER PRIMARY KEY AUTOINCREMENT, level TEXT);
INSERT INTO logs (level) VALUES ('INFO'),('ERROR'),('INFO'),('DEBUG');

CREATE TABLE audit (msg TEXT);
CREATE TRIGGER logs_delete AFTER DELETE ON logs
BEGIN INSERT INTO audit VALUES ('deleted ' || OLD.id); END;

DELETE FROM logs WHERE level = 'DEBUG';

SELECT id, level FROM logs;  -- (1,'INFO'), (2,'ERROR'), (3,'INFO')
SELECT * FROM audit;         -- 'deleted 4'

Hanya baris yang cocok yang masuk, dan pemicu mencatatnya. Menjalankan DELETE FROM logs tanpa klausa WHERE menghapus tiga baris lainnya, dan tabel audit kemudian menampung empat entri, satu per baris yang dihapus.

DELETE tidak mengatur ulang penghitung kenaikan otomatis. Setelah mengosongkan tabel, penyisipan berikutnya menerima id 5, bukan 1. Dalam SQLite ini karena AUTOINCREMENT. Kolom identitas MySQL InnoDB dan SQL Server juga berlanjut dari tempatnya setelah DELETE.

Kiat: Sebelum DELETE dengan klausa WHERE, jalankan klausa yang sama dengan SELECT COUNT(*) terlebih dahulu. Jika hitungannya mengejutkan Anda, berhentilah. Baca panduan kami tentang nilai SQL NULL untuk jebakan yang dibuat NULL dalam klausa WHERE.

TRUNCATE: mengosongkan tabel

TRUNCATE TABLE logs; menghapus setiap baris sekaligus. Itu tidak dapat mengambil klausa WHERE. Alih-alih menghapus baris satu per satu, database biasanya melepaskan halaman data tabel, itulah sebabnya mengapa hal ini jauh lebih cepat pada tabel besar.

Saat kami menjalankannya di SQLite, kami mendapat kesalahan sintaksis, karena SQLite tidak memiliki perintah:

TRUNCATE TABLE logs;
-- near "TRUNCATE": syntax error

Di SQLite, gunakan DELETE FROM logs; tanpa klausa WHERE. Dokumentasi SQLite menjelaskan “optimasi pemotongan” yang menjadikannya cepat ketika tabel tidak memiliki pemicu. Tabel kami memiliki pemicu, jadi penghapusan dijalankan baris demi baris dan mengaktifkannya untuk setiap baris.

Dalam database yang mendukung TRUNCATE, berdasarkan dokumentasinya:

  • Biasanya tidak memicu pemicu DELETE tingkat baris.
  • Biasanya mengatur ulang penghitung identitas atau kenaikan otomatis, misalnya di MySQL dan SQL Server. Di PostgreSQL Anda menambahkan RESTART IDENTITY.
  • Dibutuhkan izin yang lebih kuat daripada DELETE di sebagian besar sistem.

DROP: menghapus tabel itu sendiri

DROP TABLE adalah perintah skema (DDL). Ini menghapus data, definisi tabel, indeksnya, pemicu dan batasannya. Segala sesuatu yang mengacu pada tabel, seperti tampilan atau kunci asing, juga terpengaruh.

DROP TABLE logs;
SELECT * FROM logs;
-- no such table: logs

DROP TABLE IF EXISTS logs;  -- no error, even though it is gone

IF EXISTS berguna dalam skrip pengaturan yang mungkin dijalankan lebih dari sekali. Tampilan pada tabel yang dijatuhkan dapat rusak, seperti yang kami tunjukkan di penjelasan tampilan SQL.

Tabel perbandingan

Fitur HAPUS POTONG JATUH
Menghapus Beberapa atau semua baris Semua baris Tabel dan baris
klausa WHERE Ya Tidak Tidak
Jenis perintah DML DDL (biasanya) HAL-HAL
Baris memicu kebakaran Ya Biasanya tidak Tidak
Menyetel ulang identitas Tidak Biasanya ya Meja hilang
Kecepatan di meja besar Lambat Cepat Cepat
Tabel tetap ada Ya Ya Tidak

Bisakah kamu memutar kembali?

Di sinilah banyak artikel menyederhanakan. Jawaban jujurnya adalah itu tergantung pada database.

DELETE dapat dikembalikan ke dalam transaksi di mana saja. Kami mengujinya:

BEGIN;
DELETE FROM logs;
SELECT COUNT(*) FROM logs;  -- 0
ROLLBACK;
SELECT COUNT(*) FROM logs;  -- 3

DROP juga dibatalkan di SQLite, yang mendukung DDL transaksional:

BEGIN;
DROP TABLE logs;
ROLLBACK;
SELECT COUNT(*) FROM logs;  -- 1 (the table is back)

Untuk TRUNCATE dan DROP di database lain, menurut dokumentasinya:

Basis data TRUNCATE / DROP dalam suatu transaksi
PostgreSQL Dapat diputar kembali. DDL bersifat transaksional.
SQLServer Dapat dikembalikan ke dalam transaksi eksplisit.
MySQL Menyebabkan komit implisit, sehingga tidak dapat dibatalkan.
Peramal Berkomitmen secara implisit. DROP mungkin dapat dipulihkan dari recycle bin.

Jadi “TRUNCATE tidak akan pernah bisa dibatalkan” salah untuk PostgreSQL dan SQL Server, dan “selalu bisa dibatalkan” salah untuk MySQL. Di luar transaksi, tidak ada satupun yang dapat dibatalkan tanpa cadangan.

Mengapa TRUNCATE cepat

DELETE mencatat setiap baris yang dihapus sehingga perubahan dapat dibatalkan dan direplikasi, memicu pemicu dan memeriksa batasan baris demi baris. Di atas meja dengan jutaan baris, hal itu menciptakan banyak pekerjaan dan volume log. TRUNCATE umumnya membatalkan alokasi penyimpanan dalam satu operasi, sehingga mencatat log jauh lebih sedikit. Untuk menghapus sebagian besar daripada semuanya, hapus secara bertahap sehingga Anda menghindari kunci yang panjang. Kami menanggung biaya penguncian dan kueri dalam optimasi kueri SQL.

Kunci dan izin asing

  • Kunci asing. SQL Server menolak untuk MEMOTONG tabel yang direferensikan oleh kunci asing. PostgreSQL mengharuskan Anda untuk memotong tabel referensi juga, atau menggunakan CASCADE. DELETE memeriksa setiap baris terhadap batasan.
  • Izin. DELETE memerlukan hak penghapusan. TRUNCATE sering kali memerlukan ALTER atau hak TRUNCATE khusus, dan DROP memerlukan kepemilikan atau ALTER pada skema.
  • Replikasi dan audit. Jika sistem lain bergantung pada log perubahan atau pemicu tingkat baris, TRUNCATE mungkin melewatkannya. Tanyakan kepada siapa pun yang memiliki sistem tersebut terlebih dahulu.

Yang mana yang harus digunakan

Situasi Gunakan
Hapus pesanan pelanggan yang dibatalkan HAPUS dengan MANA
Reset tabel pementasan sebelum setiap pengujian dijalankan TRUNCATE (atau HAPUS di SQLite)
Jaga agar pemicu audit tetap berfungsi HAPUS
Hapus tabel yang tidak lagi ada dalam desain DROP dalam migrasi yang ditinjau
Hapus jutaan baris lama tetapi pertahankan baris terbaru HAPUS secara batch, atau partisi dan hapus partisi lama

Untuk data pengujian, TRUNCATE populer karena menyetel ulang ID, sehingga pengujian dapat diulang. Menggabungkan setiap pengujian dalam transaksi yang dibatalkan adalah opsi lain, dijelaskan dalam transaksi SQL dan ACID.

Daftar periksa keselamatan

  1. Konfirmasikan database dan lingkungan mana yang terhubung dengan Anda.
  2. Jalankan klausa WHERE sebagai SELECT terlebih dahulu.
  3. Bungkus perubahan dalam transaksi yang didukung database Anda.
  4. Miliki cadangan terbaru yang telah diuji sebelum TRUNCATE atau DROP dalam produksi.
  5. Masukkan pernyataan DROP dalam skrip migrasi yang telah ditinjau, jangan pernah di konsol ad-hoc.
  6. Periksa apa yang bergantung pada tabel, seperti tampilan, kunci asing, dan laporan, sebelum menghapusnya.

Menghapus data dalam jumlah besar dengan aman

Menghapus jutaan baris dengan satu DELETE dapat mengunci tabel dalam waktu lama, mengisi log transaksi, dan memperlambat replikasi. Pola yang umum adalah menghapus dalam jumlah kecil dan mengulanginya hingga tidak ada yang tersisa:

-- SQL Server style (not run for this article)
DELETE TOP (5000) FROM logs WHERE created_at < '2026-01-01';

-- PostgreSQL style (not run for this article)
DELETE FROM logs
WHERE id IN (SELECT id FROM logs WHERE created_at < '2026-01-01' LIMIT 5000);

Jalankan pernyataan dalam satu putaran, dengan jeda singkat antar batch, hingga melaporkan nol baris. Setiap batch adalah transaksi kecil, jadi kuncinya pendek dan kueri lainnya tetap berjalan. Indeks pada kolom filter, di sini created_at, membuat setiap batch tetap cepat.

Untuk data yang bertambah berdasarkan tanggal, seperti log dan peristiwa, partisi tabel bahkan lebih baik lagi. Setiap bulan berada di partisinya sendiri, dan menghapus data lama menjadi operasi cepat yang menghapus atau memotong satu partisi alih-alih menghapus baris satu per satu.

Penghapusan sementara

Banyak aplikasi tidak pernah menghapus catatan bisnis secara fisik. Mereka menambahkan kolom seperti deleted_at dan mengaturnya, dan kueri kemudian memfilter deleted_at IS NULL. Penghapusan sementara memudahkan pemulihan dan menyimpan riwayat untuk audit, namun setiap kueri harus mengingat filternya, yang merupakan pekerjaan yang baik untuk tampilan. Batasan unik juga perlu diperhatikan, karena baris yang dihapus sementara masih menyimpan nilainya. Undang-undang privasi mungkin mengharuskan penghapusan data pribadi secara nyata setelah jangka waktu tertentu, jadi penghapusan sementara bukanlah pengganti kebijakan penyimpanan.

Penutup

DELETE adalah alat yang tepat dan hati-hati. TRUNCATE adalah tombol reset cepat, dan DROP menghapus tabel seluruhnya. Risiko terbesar adalah mengasumsikan satu database berperilaku seperti database lainnya, terutama saat melakukan rollback. Jika ragu, uji perintah pada salinan tabel di database Anda terlebih dahulu.

Pertanyaan yang sering diajukan

Apa perbedaan utama antara DELETE dan TRUNCATE?

DELETE menghapus baris satu per satu, mendukung WHERE dan memicu pemicu. TRUNCATE menghapus semua baris sekaligus, jauh lebih cepat, biasanya melewatkan pemicu baris dan sering menyetel ulang penghitung identitas.

Bisakah TRUNCATE dibatalkan?

Di PostgreSQL dan SQL Server, ya, di dalam transaksi. Di MySQL dan Oracle, hal ini dilakukan secara implisit, sehingga tidak dapat dibatalkan.

Apakah DELETE mengatur ulang nilai kenaikan otomatis?

Tidak. Setelah DELETE, baris baru dilanjutkan dari penghitung sebelumnya. Dalam pengujian SQLite kami, ID berikutnya adalah 5 setelah menghapus semua baris.

Apakah SQLite mendukung TRUNCATE?

Tidak. Gunakan tabel DELETE FROM tanpa klausa WHERE. SQLite mengoptimalkan ini ketika tabel tidak memiliki pemicu.

Apa yang dihapus oleh DROP TABLE?

Data, definisi tabel, indeks, pemicu dan batasan. Tampilan dan kunci asing yang bergantung pada tabel dapat merusak atau memblokir penurunan.

Teruslah belajar

Bekerja dengan Stack Quora

Butuh bantuan dengan pengujian, WordPress atau SEO?

Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.

Teruslah membaca

Panduan lebih lanjut tentang pengujian, AI & pengembangan modern

Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.

Kecerdasan buatan

Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya

Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…

Baca artikel →
DevOps

Penjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar

Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan

Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…

Baca artikel →
Otomatisasi pengujian

Mengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong

Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…

Baca artikel →
Pengujian perangkat lunak

Penjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya

Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…

Baca artikel →
Basis data & SQL

DELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing

DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…

Baca artikel →
Basis data & SQL

Penjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh

Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…

Baca artikel →
Pengembangan perangkat lunak

Antarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler

Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas

Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…

Baca artikel →
Pengembangan perangkat lunak

Fungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan

Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…

Baca artikel →
Kecerdasan buatan

Apa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan

Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…

Baca artikel →
DevOps

Pemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak

Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…

Baca artikel →
DevOps

Volume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar

Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…

Baca artikel →
Otomatisasi pengujian

TDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing

TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…

Baca artikel →
Pengembangan perangkat lunak

Git merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing

Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.

Baca artikel →
Pengembangan perangkat lunak

List Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari

List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.

Baca artikel →
Basis data & SQL

Penjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)

Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.

Baca artikel →