Artikel ini berisi DELETE
SQL dasar pernyataan yang dapat digunakan pemula untuk menghapus data dari tabel database mereka.
Menghapus Satu Baris
Berikut adalah contoh dasar dari SQL DELETE
pernyataan.
DELETE FROM Owners
WHERE OwnerId = 5;
Dalam hal ini kami menghapus baris di mana OwnerId
kolom memiliki nilai 4
.
DELETE
pernyataan dimulai dengan DELETE FROM
, diikuti dengan nama tabel (yaitu tabel yang berisi data yang ingin Anda hapus).
Dalam beberapa Sistem Manajemen Basis Data (DBMS), kode FROM
kata kunci bersifat opsional, tetapi sebaiknya menyertakannya untuk portabilitas yang lebih baik (jika Anda perlu menjalankan kode yang sama pada DBMS yang berbeda).
Anda harus selalu menyertakan WHERE
klausa, kecuali jika Anda ingin menghapus semua baris dari tabel.
Ya, Anda membacanya dengan benar. Menghilangkan WHERE
klausa akan menghapus semua baris dalam tabel.
Sebagian besar DBMS memiliki berbagai opsi lain yang dapat Anda gunakan dengan DELETE
pernyataan, tetapi yang tercantum di sini adalah yang paling umum digunakan.
Perhatikan bahwa DELETE
pernyataan menghapus seluruh baris. Anda tidak dapat menghapus nilai kolom individual dalam satu baris. Untuk melakukan ini, gunakan SQL UPDATE
pernyataan.
Contoh
Dalam contoh ini, kami menghapus data dari sebuah tabel.
Pertama-tama, mari kita lihat apa yang ada di tabel.
SELECT * FROM Owners;
Hasil:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Oke kita hapus pemilik nomor 5, lalu pilih tabel lagi.
DELETE FROM Owners
WHERE OwnerId = 5;
SELECT * FROM Owners;
Hasil:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Kita dapat melihat bahwa baris terakhir telah dihapus seperti yang ditentukan.
Kunci Asing
Anda mungkin mendapatkan kesalahan jika mencoba menghapus data yang direferensikan oleh kunci asing di tabel lain. Ini karena tabel yang Anda coba hapus datanya adalah tabel induk dalam suatu hubungan. Tabel dengan kunci asing (tabel anak) bergantung pada data di tabel induk (yaitu data yang Anda coba hapus).
Apakah Anda mendapatkan kesalahan atau tidak akan tergantung pada bagaimana kunci asing dikonfigurasi. Kebanyakan DBMS mendukung berbagai pilihan untuk menghadapi situasi ini. Opsi tersebut dapat mencakup, memunculkan kesalahan, mengalirkan penghapusan ke tabel kunci asing (yaitu menghapus baris dari tabel anak), menyetel kunci asing ke NULL
, atau menyetelnya ke nilai default.
Berikut ini contoh mencoba menghapus baris yang direferensikan oleh kunci asing.
DELETE FROM Owners
WHERE OwnerId = 3;
Hasil:
Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'. The statement has been terminated.
Dalam hal ini, kesalahan muncul, dan baris tidak dihapus.
Dalam contoh ini, Owners.OwnerId
kolom adalah kunci utama dari tabel ini. Tabel lain bernama Pets
memiliki OwnerId
kolom yang mereferensikan kolom kunci utama ini, dan dalam hal ini, setidaknya ada satu baris yang mereferensikan nomor pemilik 3.
Jika saya benar-benar ingin menghapus baris ini, saya perlu memperbarui data di tabel anak sehingga tidak ada baris yang mengarah ke pemilik ini. Entah itu, atau memodifikasi kunci asing sehingga menggunakan opsi yang berbeda ketika operasi penghapusan terjadi pada kunci utama. Memodifikasi kunci asing bisa menjadi pilihan yang tidak diinginkan, tergantung pada apa yang perlu Anda lakukan. Bergantung pada DBMS Anda, mungkin juga perlu menghapus kunci yang ada dan membuatnya kembali.
Bagaimanapun, kesalahan ini adalah hal yang baik, karena mengingatkan kita akan masalah yang akan kita hadapi jika kita menghapus baris ini. Ini membantu menegakkan integritas referensial.
Hati-hati! Lupa kode WHERE
Klausa
DELETE
pernyataan bisa menjadi pernyataan yang sangat berbahaya. Jika Anda menghilangkan WHERE
klausa, Anda akan menghapus semua baris dalam tabel.
Untungnya, Anda mungkin diselamatkan oleh batasan kunci asing jika Anda mencoba menghapus data dari tabel induk suatu hubungan.
Tapi bagaimana jika tidak. Bagaimana jika tidak ada kesalahan yang ditimbulkan oleh pernyataan penghapusan Anda?
Mari cari tahu!
Mari kita jalankan DELETE
lainnya pernyataan, tapi kali ini kita akan lupa untuk memasukkan WHERE
ayat. Selain itu, kali ini kita akan menjalankannya terhadap tabel yang bukan merupakan parent dalam suatu hubungan.
Pertama, mari kita lihat apa yang ada di tabel.
SELECT * FROM Pets;
Hasil:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Oke, jadi kita punya delapan hewan peliharaan. Kita sebenarnya dapat melihat bahwa tiga hewan peliharaan dimiliki oleh pemilik nomor 3 – pemilik yang kita coba hapus pada contoh sebelumnya. Inilah mengapa kami mendapatkan kesalahan.
Bagaimanapun, mari kita lanjutkan dan jalankan DELETE
our pernyataan tanpa WHERE
klausa, lalu periksa tabel lagi
DELETE FROM Pets;
SELECT * FROM Pets;
Hasil:
(8 rows affected) (0 rows affected)
(8 rows affected)
bagian berarti delapan baris telah dihapus.
(0 rows affected)
part berarti tidak ada baris yang dipilih (karena tidak ada baris dalam tabel.
Ups!
Mungkin ada saat-saat di mana Anda sebenarnya perlu menghapus semua baris dalam tabel. Bergantung pada ukuran tabel, hanya pernyataan ini yang Anda butuhkan.
Jika Anda perlu menghapus tabel yang lebih besar, ada juga TRUNCATE TABLE
, yang menghapus semua baris dari tabel atau partisi tabel tertentu, tanpa mencatat penghapusan baris individual (DELETE
pernyataan mencatat penghapusan ini).
Oleh karena itu, TRUNCATE TABLE
lebih cepat dan menggunakan lebih sedikit sumber daya sistem dan log transaksi.
Contoh penggunaan TRUNCATE TABLE
:
TRUNCATE TABLE Owners;
Perhatikan bahwa ini mungkin tidak berfungsi jika tabel direferensikan oleh batasan kunci asing, bahkan jika tidak ada baris anak. Dalam kasus seperti itu, DELETE
dapat bekerja sebagai gantinya.