Kursus
Menghapus data adalah operasi yang berpotensi berisiko dalam SQL. Satu perintah yang ditulis dengan buruk dapat mengganggu relasi antar tabel atau bahkan menghapus seluruh dataset.
Dalam tutorial ini, saya akan menunjukkan cara kerja pernyataan DELETE, cara menggunakannya dengan benar, dan bagaimana menghindari kesalahan umum, seperti menghapus seluruh dataset, seperti yang baru saja saya sebutkan.
Jika Anda baru dalam SQL, mulailah dengan kursus Introduction to SQL kami atau kursus Intermediate SQL jika Anda sudah memiliki sedikit pengalaman.
Apa yang Dilakukan DELETE dalam SQL?
Sebelum melihat sintaksnya, penting untuk memahami apa yang sebenarnya dilakukan pernyataan DELETE. Berikut adalah beberapa pembedaan cara menghapus data dalam SQL.
SQL DELETE vs. menghapus baris secara konseptual
Pernyataan DELETE menghapus satu atau beberapa baris dari sebuah tabel sambil mempertahankan struktur tabel. Dengan demikian, skema tabel, yang mencakup nama kolom, tipe data, indeks, dan constraint, tetap utuh. Setelah penghapusan, tabel masih ada dan siap menerima data baru.
Bayangkan seperti menghapus entri dari buku besar, bukan merobek halamannya. Skema tetap sama; hanya rekaman terpilih yang dihapus.
SQL DELETE vs. DROP vs. TRUNCATE
Meskipun DELETE, DROP, dan TRUNCATE sama-sama menghapus data dalam beberapa bentuk, mereka memiliki tujuan yang sangat berbeda. Tabel berikut merangkum penggunaan masing-masing pernyataan:
|
Fitur |
DELETE |
TRUNCATE |
DROP |
|
Jenis Perintah |
DDL (Data Definition Language) |
||
|
Cakupan |
Menghapus baris tertentu (menggunakan klausa |
Menghapus semua baris dari sebuah tabel |
Menghapus seluruh tabel beserta datanya. |
|
Kecepatan |
Lebih lambat (menghapus baris demi baris) |
Lebih cepat (membebaskan halaman) |
Seketika |
|
Dapat Dibalik |
Dapat di-rollback |
Tidak dapat dibalik |
Tidak dapat dibalik. |
|
Struktur Tabel |
Dipertahankan |
Dipertahankan (dan mereset ID) |
Dihapus seluruhnya |
Sintaks Dasar SQL DELETE
Sekarang setelah Anda memahami cara kerja pernyataan DELETE, mari kita lihat sintaksnya dan bagaimana menerapkannya.
Menghapus baris tertentu dengan WHERE
Klausa WHERE menentukan cakupan operasi DELETE. Klausa WHERE selalu diperlukan karena memberi tahu database tepatnya baris mana yang harus dihapus.
-- Basic DELETE syntax
DELETE FROM table_name
WHERE condition;
Menghapus semua baris dalam sebuah tabel
Jika Anda menghilangkan klausa WHERE dalam pernyataan DELETE, SQL menganggap Anda ingin menargetkan setiap baris dalam tabel. Jika Anda tidak sengaja melakukan ini, mesin database akan menelusuri setiap rekaman dan menghapusnya. Untuk setiap baris yang dihapus, dibuat entri dalam log transaksi. Jika Anda memiliki jutaan baris, ini bisa sangat lambat dan menyebabkan file log membengkak.
Praktik Aman SQL DELETE
Karena operasi DELETE bisa bersifat permanen, menerapkan praktik penghapusan yang aman akan membantu Anda memperlambat, memverifikasi niat, dan merencanakan cara memulihkan jika/ketika terjadi kesalahan.
Pratinjau baris sebelum menghapus
Sebelum menjalankan pernyataan DELETE, selalu pratinjau baris yang akan Anda hapus menggunakan pernyataan SELECT dengan kondisi WHERE yang sama yang Anda rencanakan untuk digunakan dalam DELETE. Jika pernyataan SELECT mengembalikan terlalu banyak baris, atau baris yang salah, Anda dapat memperbaiki kondisinya sebelum terjadi kerusakan.
Sebagai contoh, kueri di bawah ini memeriksa baris dengan pesanan dibatalkan sebelum 2023-01-01, lalu menggunakan filter yang sama untuk menghapus rekaman tersebut.
-- Step 1: Preview the targets
SELECT * FROM Orders
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';
-- Step 2: Once you've verified the list, convert to DELETE
DELETE FROM Orders
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';
Menggunakan transaksi dan rollback
Jika Anda membungkus operasi DELETE di dalam sebuah transaksi, ini memungkinkan Anda menjalankan perintah, melihat berapa banyak baris yang terpengaruh, lalu memutuskan apakah akan menjadikannya permanen atau membatalkannya sepenuhnya. Anda kemudian dapat menggunakan ROLLBACK untuk mengembalikan data ke keadaan sebelumnya.
Kueri di bawah ini menghapus baris yang memenuhi syarat secara sementara dan kemudian memulihkannya, memungkinkan Anda mengonfirmasi dampaknya tanpa kehilangan data.
BEGIN TRANSACTION;
DELETE FROM Users
WHERE LastLogin < '2020-01-01';
-- Inspect the affected row count
ROLLBACK;
Anda kemudian dapat menggunakan kueri berikut untuk secara permanen menghapus pengguna yang terakhir masuk sebelum 1 Januari 2020.
BEGIN TRANSACTION;
DELETE FROM Users
WHERE LastLogin < '2020-01-01';
-- Confirm deletion of the required rows
COMMIT;
Namun, Anda harus mencatat bahwa ROLLBACK hanya mungkin jika Anda belum melakukan commit transaksi.
SQL DELETE dengan Join dan Subkueri
Dalam database dunia nyata, data jarang berdiri sendiri. Dalam banyak kasus, Anda mungkin perlu menghapus baris berdasarkan nilai yang disimpan di tabel lain, akun yang kedaluwarsa, rekaman yatim, atau entitas terkait yang tidak lagi berlaku.
Menghapus baris berdasarkan tabel lain
Menggunakan subkueri adalah pendekatan paling portabel dan paling luas didukung untuk menghapus baris berdasarkan tabel lain. Cara ini berfungsi di hampir semua varian SQL. Misalnya, kueri di bawah ini menghapus pengguna tidak aktif dari tabel Users yang memiliki akun dinonaktifkan dari tabel Accounts.
-- Delete users whose accounts have been deactivated
DELETE FROM Users
WHERE AccountId IN (
SELECT AccountId
FROM Accounts
WHERE Status = 'DEACTIVATED'
);
Anda juga dapat menggunakan Join untuk menghapus baris dalam database, tetapi sintaksnya berbeda-beda menurut database, seperti yang akan kita lihat di bagian berikutnya.
Sintaks DELETE khusus database
Walaupun gagasan pernyataan DELETE sama dalam SQL, setiap database memiliki sintaks berbeda saat menggunakan JOIN untuk menghapus baris dari satu tabel berdasarkan tabel lain.
SQL Server menempatkan tabel target setelah pernyataan DELETE, lalu melakukan join di FROM. Pada contoh di bawah, alias setelah DELETE (u) menentukan tabel mana yang dihapus.
-- SQL Server: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';
Di PostgreSQL, USING bertindak seperti JOIN. Hanya baris dari tabel target (Users) yang dihapus.
-- PostgreSQL: Delete users linked to deactivated accounts
DELETE FROM Users
USING Accounts
WHERE Users.AccountId = Accounts.AccountId
AND Accounts.Status = 'DEACTIVATED';
MySQL mengizinkan penghapusan multi-tabel tetapi memerlukan penamaan tabel secara eksplisit. Anda harus menempatkan tabel yang akan dihapus sebelum klausa FROM.
-- MySQL: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';
Saya merekomendasikan mengikuti kursus Joining Data in SQL untuk mempelajari berbagai jenis join dalam SQL dan cara bekerja dengan berbagai tabel terkait di database.
SQL DELETE dan Integritas Referensial
Seperti yang kini kita ketahui, tabel jarang berdiri sendiri dalam database relasional. Mereka sering terhubung menggunakan foreign key. Karena keterkaitan ini, menghapus baris di satu tabel dapat menimbulkan konsekuensi yang tidak diinginkan.
Foreign key dan error constraint
Ketika sebuah tabel direferensikan oleh sebuah foreign key, database memberlakukan aturan tentang apa yang terjadi ketika Anda mencoba menghapus baris induk. Secara bawaan, sebagian besar database mencegah penghapusan jika baris terkait masih ada di tabel anak.
Sebagai contoh, jika Anda memiliki tabel Orders yang mereferensikan tabel Customers, menghapus pelanggan yang masih memiliki pesanan akan gagal dengan error constraint. Ini melindungi database dari berisi rekaman yatim yang tidak lagi memiliki induk yang valid.
Penghapusan berantai (cascading deletes)
Jika Anda ingin menghapus data terkait secara otomatis, Anda perlu secara eksplisit mendefinisikan aturan berantai yang menginstruksikan database cara menangani data terkait. ON DELETE CASCADE memberi tahu database untuk secara otomatis menghapus baris anak terkait saat baris induk dihapus.
Misalnya, kueri di bawah ini menginstruksikan database untuk secara otomatis menghapus semua baris di tabel Orders yang mereferensikan seorang pelanggan ketika pelanggan tersebut dihapus dari tabel Customers.
-- Parent table
CREATE TABLE Customers (
CustomerId INT PRIMARY KEY,
Name VARCHAR(100)
);
-- Child table with a cascading foreign key
CREATE TABLE Orders (
OrderId INT PRIMARY KEY,
CustomerId INT,
OrderDate DATE,
CONSTRAINT fk_orders_customers
FOREIGN KEY (CustomerId)
REFERENCES Customers(CustomerId)
ON DELETE CASCADE
);
Keuntungan pendekatan ini adalah menjaga database tetap bersih tanpa memerlukan beberapa pernyataan DELETE manual. Namun, Anda harus menggunakannya dengan hati-hati karena satu penghapusan dapat memicu reaksi berantai di banyak tabel, menghapus jauh lebih banyak data daripada yang diharapkan. Misalnya, Anda mungkin menghapus satu baris di tabel Departments dan tanpa sengaja menghapus 500 baris di tabel Employees.
Pertimbangan Kinerja Saat Menghapus Data
Saat Anda menggunakan pernyataan DELETE, Anda akan melihat bahwa menghapus beberapa baris berlangsung seketika, tetapi menjadi lambat jika Anda memiliki jutaan baris. Pertimbangkan praktik terbaik berikut untuk menghapus rekaman dengan aman:
DELETE vs. TRUNCATE untuk tabel besar
Seperti yang kita lihat sebelumnya, DELETE dan TRUNCATE sama-sama menghapus rekaman dengan cara berikut:
-
DELETE: Menelusuri setiap baris, memeriksa apakah memenuhi kriteria, menghapusnya, dan mencatat perubahan dalam log transaksi. Ini berat sumber daya dan lambat untuk dataset yang sangat besar. Memungkinkan pemfilteran dengan klausaWHEREdan mendukung rollback. -
TRUNCATE: Menghapus semua baris sekalian dengan pencatatan minimal. Jauh lebih cepat tetapi tidak dapat difilter, biasanya tidak dapat di-rollback, dan diblokir oleh constraint foreign key.
Penghapusan bertahap (batch) dan operasi berdurasi lama
Jika Anda menghapus jutaan baris dalam satu pernyataan, itu dapat memperlambat aplikasi Anda secara signifikan dan bahkan menyebabkan database crash jika tidak ditangani dengan benar. Untuk mengurangi risiko ini, selalu hapus dataset besar secara bertahap (batch).
Penghapusan batch menghapus sejumlah baris terbatas setiap kali, misalnya beberapa ribu per operasi. Ini memungkinkan database tetap responsif dan memudahkan pemantauan kemajuan. Jika terjadi sesuatu yang salah, Anda dapat menghentikan proses tanpa harus me-rollback transaksi yang sangat besar.
Kesalahan Umum SQL DELETE
Berikut adalah kesalahan umum yang harus Anda waspadai saat menggunakan pernyataan DELETE untuk menghapus baris di tabel Anda:
Lupa klausa WHERE
Melupakan klausa WHERE adalah kesalahan paling umum saat menggunakan DELETE. Tanpanya, pernyataan akan menghapus setiap baris dalam tabel. Selalu pastikan Anda menggunakan klausa WHERE untuk menentukan baris yang akan dihapus. Sebagai langkah pencegahan, gunakan kebiasaan SELECT-sebelum-DELETE yang kita bahas sebelumnya untuk melihat barisnya sebelum menghapus.
Menganggap DELETE dapat dibalik
Kesalahpahaman umum lainnya adalah data yang dihapus selalu dapat dipulihkan. Anda harus mencatat bahwa, secara bawaan, pernyataan DELETE, setelah di-commit, menandai data sebagai dihapus secara fisik dari disk, kecuali Anda memiliki cadangan, replika, atau log audit.
Anda hanya dapat "membatalkan" perintah DELETE jika:
- Dijalankan di dalam transaksi.
- Transaksi belum di-commit.
- Database dan storage engine mendukung rollback.
SQL DELETE di Lingkungan Produksi
Dalam sistem produksi, operasi DELETE lebih mengenai kontrol, visibilitas, dan akuntabilitas dibandingkan sekadar sintaks. Di lingkungan seperti ini, tujuannya bukan hanya menghapus data, tetapi melakukannya dengan aman dan sengaja.
Kontrol akses dan perizinan
Dalam lingkungan profesional, kemampuan untuk menghapus data harus mengikuti Prinsip Hak Istimewa Paling Minimal (Principle of Least Privilege). Tidak setiap pengguna atau akun layanan aplikasi boleh memiliki izin DELETE.
Sebagian besar pengguna "Read-Only" atau alat pelaporan harus secara eksplisit ditolak hak ini. Sebagian besar perusahaan biasanya mensyaratkan “Peer Review,” di mana orang kedua harus memverifikasi klausa WHERE dari skrip delete manual sebelum dieksekusi di produksi.
Saya sarankan Anda mencoba jalur keterampilan SQL Server for Database Administrators jika Anda secara rutin merancang atau memelihara database sebagai bagian dari pekerjaan.
Audit dan soft delete
Banyak sistem produksi menghindari hard delete karena risikonya. Sebagai gantinya, mereka menggunakan soft delete, di mana sebuah baris ditandai sebagai dihapus. Misalnya, Anda dapat menggunakan stempel waktu deleted_at atau flag is_deleted alih-alih menghapus rekaman secara fisik.
Soft delete memudahkan pemulihan, mendukung audit, dan mempertahankan data historis untuk tujuan debugging dan kepatuhan.
Kesimpulan
Hal terpenting yang perlu diingat adalah: Selalu definisikan klausa WHERE yang jelas, pratinjau baris yang terpengaruh dengan SELECT, dan gunakan transaksi kapan pun memungkinkan. Di sistem produksi, setiap penghapusan harus disengaja dan dapat diaudit. Perlakukan DELETE dengan kehati-hatian yang sama seperti saat Anda melakukan perubahan skema atau deployment, maka perintah ini akan tetap menjadi alat yang berguna, bukan kesalahan yang mahal.
Saya merekomendasikan mengikuti kursus Database Design, di mana Anda akan belajar membuat dan mengelola database serta memilih DBMS yang sesuai dengan kebutuhan Anda. Saya juga merekomendasikan mencoba jalur karier Associate Data Engineer in SQL untuk mempelajari dasar-dasar rekayasa data dan gudang data.
FAQ SQL DELETE
Apa bedanya DELETE dengan TRUNCATE atau DROP?
DELETE menghapus baris yang dipilih, TRUNCATE menghapus semua baris dengan cepat, dan DROP menghapus tabel itu sendiri.
Mengapa klausa WHERE penting dalam DELETE?
Tanpa klausa WHERE, DELETE menghapus semua baris, berisiko menyebabkan kehilangan data secara total.
Mengapa beberapa operasi DELETE gagal?
Constraint foreign key mencegah penghapusan jika baris anak yang bergantung masih ada tanpa aturan berantai.
Bagaimana saya bisa mempratinjau dengan aman apa yang akan dihapus?
Gunakan pernyataan SELECT dengan kondisi WHERE yang sama untuk meninjau baris yang terpengaruh terlebih dahulu sebelum menghapus.
Bagaimana cara menghapus dataset besar dengan aman?
Gunakan penghapusan batch untuk menghapus baris secara bertahap, agar terhindar dari transaksi berdurasi lama dan masalah kinerja.

