Pahami cara menggunakan SQL DELETE untuk menghapus rekaman dalam tabel. Pelajari sintaks kunci, alur kerja keamanan, dan teknik optimasi untuk menangani dataset besar.
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:
Menghapus baris tertentu (menggunakan klausa WHERE)
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 syntaxDELETEFROM table_name
WHERE condition;Didukung oleh
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 targetsSELECT*FROM Orders
WHEREStatus='Cancelled'AND OrderDate <'2023-01-01';-- Step 2: Once you've verified the list, convert to DELETEDELETEFROM Orders
WHEREStatus='Cancelled'AND OrderDate <'2023-01-01';Didukung oleh
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.
BEGINTRANSACTION;DELETEFROM Users
WHERE LastLogin <'2020-01-01';-- Inspect the affected row countROLLBACK;Didukung oleh
Anda kemudian dapat menggunakan kueri berikut untuk secara permanen menghapus pengguna yang terakhir masuk sebelum 1 Januari 2020.
BEGINTRANSACTION;DELETEFROM Users
WHERE LastLogin <'2020-01-01';-- Confirm deletion of the required rowsCOMMIT;Didukung oleh
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 deactivatedDELETEFROM Users
WHERE AccountId IN(SELECT AccountId
FROM Accounts
WHEREStatus='DEACTIVATED');Didukung oleh
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 accountsDELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status='DEACTIVATED';Didukung oleh
Di PostgreSQL, USING bertindak seperti JOIN. Hanya baris dari tabel target (Users) yang dihapus.
-- PostgreSQL: Delete users linked to deactivated accountsDELETEFROM Users
USING Accounts
WHERE Users.AccountId = Accounts.AccountId
AND Accounts.Status='DEACTIVATED';Didukung oleh
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 accountsDELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status='DEACTIVATED';Didukung oleh
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 tableCREATETABLE Customers (
CustomerId INTPRIMARYKEY,
Name VARCHAR(100));-- Child table with a cascading foreign keyCREATETABLE Orders (
OrderId INTPRIMARYKEY,
CustomerId INT,
OrderDate DATE,CONSTRAINT fk_orders_customers
FOREIGNKEY(CustomerId)REFERENCES Customers(CustomerId)ONDELETECASCADE);Didukung oleh
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 klausa WHERE dan 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.
Penulis teknis Data Science dengan pengalaman langsung dalam analitik data, business intelligence, dan data science. Saya menulis konten praktis berfokus industri tentang SQL, Python, Power BI, Databricks, dan rekayasa data, yang berakar pada pekerjaan analitik dunia nyata. Tulisan saya menjembatani kedalaman teknis dan dampak bisnis, membantu para profesional mengubah data menjadi keputusan yang meyakinkan.
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.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai kueri SQL yang kompleks yang diperlukan untuk menjawab berbagai pertanyaan ilmu data dan menyiapkan set data yang kuat untuk analisis di PostgreSQL.
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
DELETEmenghapus 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, danTRUNCATEsama-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
DML (Data Manipulation Language)
DDL (Data Definition Language)
DDL (Data Definition Language)
Cakupan
Menghapus baris tertentu (menggunakan klausa
WHERE)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
WHEREmenentukan cakupan operasiDELETE. KlausaWHEREselalu diperlukan karena memberi tahu database tepatnya baris mana yang harus dihapus.Menghapus semua baris dalam sebuah tabel
Jika Anda menghilangkan klausa
WHEREdalam pernyataanDELETE, 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
DELETEbisa 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 pernyataanSELECTdengan kondisiWHEREyang sama yang Anda rencanakan untuk digunakan dalamDELETE. Jika pernyataanSELECTmengembalikan 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.Menggunakan transaksi dan rollback
Jika Anda membungkus operasi
DELETEdi 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 menggunakanROLLBACKuntuk 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.
Anda kemudian dapat menggunakan kueri berikut untuk secara permanen menghapus pengguna yang terakhir masuk sebelum 1 Januari 2020.
Namun, Anda harus mencatat bahwa
ROLLBACKhanya 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
Usersyang memiliki akun dinonaktifkan dari tabelAccounts.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
DELETEsama dalam SQL, setiap database memiliki sintaks berbeda saat menggunakanJOINuntuk menghapus baris dari satu tabel berdasarkan tabel lain.SQL Server menempatkan tabel target setelah pernyataan
DELETE, lalu melakukan join diFROM. Pada contoh di bawah, alias setelahDELETE(u) menentukan tabel mana yang dihapus.Di PostgreSQL,
USINGbertindak sepertiJOIN. Hanya baris dari tabel target (Users) yang dihapus.MySQL mengizinkan penghapusan multi-tabel tetapi memerlukan penamaan tabel secara eksplisit. Anda harus menempatkan tabel yang akan dihapus sebelum klausa
FROM.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
Ordersyang mereferensikan tabelCustomers, 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 CASCADEmemberi 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
Ordersyang mereferensikan seorang pelanggan ketika pelanggan tersebut dihapus dari tabelCustomers.Keuntungan pendekatan ini adalah menjaga database tetap bersih tanpa memerlukan beberapa pernyataan
DELETEmanual. 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 tabelDepartmentsdan tanpa sengaja menghapus 500 baris di tabelEmployees.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,
DELETEdanTRUNCATEsama-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
WHEREadalah kesalahan paling umum saat menggunakanDELETE. Tanpanya, pernyataan akan menghapus setiap baris dalam tabel. Selalu pastikan Anda menggunakan klausaWHEREuntuk menentukan baris yang akan dihapus. Sebagai langkah pencegahan, gunakan kebiasaanSELECT-sebelum-DELETEyang 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
DELETEjika:SQL DELETE di Lingkungan Produksi
Dalam sistem produksi, operasi
DELETElebih 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
WHEREdari 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_atatau flagis_deletedalih-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
WHEREyang jelas, pratinjau baris yang terpengaruh denganSELECT, dan gunakan transaksi kapan pun memungkinkan. Di sistem produksi, setiap penghapusan harus disengaja dan dapat diaudit. PerlakukanDELETEdengan 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.