Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara terbaik untuk menggunakan Pernyataan SQL DELETE dalam tabel SQL

Dalam database relasional, kami membuat tabel untuk menyimpan data dalam berbagai format. SQL Server menyimpan data dalam format baris dan kolom yang menyimpan nilai yang terkait dengan setiap tipe data. Ketika kita mendesain tabel SQL, kita mendefinisikan tipe data seperti integer, float, desimal, varchar dan bit. Misalnya, tabel yang menyimpan data pelanggan mungkin memiliki bidang seperti nama pelanggan, email, alamat, negara bagian, negara, dan sebagainya. Berbagai perintah SQL dilakukan pada tabel SQL dan dapat dibagi ke dalam kategori berikut:

  • Bahasa Definisi Data (DDL):  Perintah ini digunakan untuk membuat dan memodifikasi objek database dalam database.
    • Buat:  Membuat objek
    • Ubah:  Memodifikasi objek
    • Lepaskan:  Menghapus objek
    • Memotong:  Menghapus semua data dari tabel
  • Bahasa Manipulasi Data (DML):  Perintah ini menyisipkan, mengambil, memodifikasi, menghapus, dan memperbarui data dalam database.
    • Pilih:  Mengambil data dari satu atau beberapa tabel
    • Sisipkan:  Menambahkan data baru dalam tabel
    • Pembaruan:  Memodifikasi data yang ada
    • Hapus:  Menghapus record yang ada dalam tabel

  • Bahasa Kontrol Data (DCL):  Perintah ini terkait dengan kontrol hak atau izin dalam database.
    • Hibah:  Memberikan izin kepada pengguna
    • Cabut:  Mencabut izin dari pengguna
  • Bahasa Kontrol Transaksi (TCL):  Perintah ini mengontrol transaksi dalam database.
    • Berkomitmen:  Menyimpan perubahan yang dibuat oleh kueri
    • Kembalikan: Mengembalikan transaksi eksplisit atau implisit ke awal transaksi, atau ke savepoint di dalam transaksi
    • Simpan transaksi:  Menetapkan savepoint atau penanda dalam transaksi

Misalkan Anda memiliki data pesanan pelanggan yang disimpan dalam tabel SQL. Jika Anda terus memasukkan data dalam tabel ini secara terus-menerus, tabel dapat berisi jutaan catatan, yang akan menyebabkan masalah kinerja dalam aplikasi Anda. Pemeliharaan indeks Anda mungkin juga menjadi sangat memakan waktu. Seringkali, Anda tidak perlu menyimpan pesanan yang berumur lebih dari tiga tahun. Dalam hal ini, Anda bisa menghapus catatan tersebut dari tabel. Ini akan menghemat ruang penyimpanan, serta mengurangi upaya pemeliharaan Anda.

Anda dapat menghapus data dari tabel SQL dengan dua cara:

  • Menggunakan pernyataan penghapusan SQL
  • Menggunakan truncate

Kita akan melihat perbedaan antara perintah SQL ini nanti. Pertama-tama mari kita jelajahi pernyataan penghapusan SQL.

Pernyataan penghapusan SQL tanpa syarat apa pun

Dalam pernyataan bahasa manipulasi data (DML), pernyataan penghapusan SQL menghapus baris dari tabel. Anda dapat menghapus baris tertentu atau semua baris. Pernyataan penghapusan dasar tidak memerlukan argumen apa pun.

Mari kita buat tabel SQL Orders menggunakan skrip di bawah ini. Tabel ini memiliki tiga kolom [OrderID], [ProductName] dan [ProductQuantity].

Create Table Orders (   OrderID int, ProductName varchar(50), ProductQuantity int )

Sisipkan beberapa record dalam tabel ini.

Insert into Orders values (1,'ABC books',10), (2,'XYZ',100), (3,'SQL book',50)

Sekarang, misalkan kita ingin menghapus data tabel. Anda dapat menentukan nama tabel untuk menghapus data menggunakan pernyataan hapus. Kedua pernyataan SQL adalah sama. Kita dapat menentukan nama tabel dari kata kunci (opsional) atau menentukan nama tabel secara langsung setelah penghapusan.

Delete Orders Go Delete from Orders GO

Pernyataan penghapusan SQL dengan data yang difilter

Pernyataan penghapusan SQL ini menghapus semua data tabel. Biasanya, kami tidak menghapus semua baris dari tabel SQL. Untuk menghapus baris tertentu, kita dapat menambahkan klausa where dengan pernyataan delete. Klausa where berisi kriteria filter dan akhirnya menentukan baris mana yang akan dihapus.

Misalnya, kita ingin menghapus order id 1. Setelah kita menambahkan klausa where, SQL Server pertama-tama memeriksa baris yang sesuai dan menghapus baris tertentu tersebut.
Delete Orders where orderid=1

Jika kondisi klausa where salah, itu tidak menghapus baris apa pun. Misalnya, kami menghapus pesanan 1 dari tabel pesanan. Jika kita mengeksekusi pernyataan itu lagi, ia tidak menemukan baris yang memenuhi kondisi klausa where. Dalam hal ini, ia mengembalikan 0 baris yang terpengaruh.

Pernyataan hapus SQL dan klausa TOP

Anda dapat menggunakan pernyataan TOP untuk menghapus baris juga. Misalnya, kueri di bawah ini menghapus 100 baris teratas dari tabel Pesanan.

Delete top (100) [OrderID] from Orders

Karena kami belum menentukan 'ORDER BY', ia mengambil baris acak dan menghapusnya. Kita dapat menggunakan klausa Order by untuk mengurutkan data dan menghapus baris teratas. Dalam kueri di bawah, ia mengurutkan [OrderID] dalam urutan menurun, lalu menghapusnya dari tabel [Orders].

Delete from Orders where [OrderID] In ( Select top 100 [OrderID] FROM Orders order by [OrderID] Desc )

Menghapus baris berdasarkan tabel lain

Terkadang kita perlu menghapus baris berdasarkan tabel lain. Tabel ini mungkin ada di database yang sama atau tidak.

  • Pencarian tabel

Kita dapat menggunakan metode pencarian tabel atau gabungan SQL untuk menghapus baris-baris ini. Misalnya, kami ingin menghapus baris dari tabel [Pesanan] yang memenuhi kondisi berikut:

Itu harus memiliki baris yang sesuai di tabel [dbo].[Pelanggan].

Lihat kueri di bawah ini, di sini kita memiliki pernyataan pilih di klausa where dari pernyataan hapus. SQL Server pertama-tama mendapatkan baris yang memenuhi pernyataan pilih dan kemudian menghapus baris tersebut dari tabel [Orders] menggunakan pernyataan hapus SQL.

Delete Orders where orderid in (Select orderid  from Customer)
  • Gabung dengan SQL

Atau, kita dapat menggunakan gabungan SQL di antara tabel-tabel ini dan menghapus baris. Dalam kueri di bawah ini, kami menggabungkan tabel [Pesanan]] dengan tabel [Pelanggan]. Gabungan SQL selalu berfungsi pada kolom umum di antara tabel. Kami memiliki kolom [OrderID] yang menggabungkan kedua tabel.

DELETE Orders FROM Orders o INNER JOIN Customer c ON o.orderid=c.orderid

Untuk memahami pernyataan penghapusan di atas, mari kita lihat rencana eksekusi yang sebenarnya.

Sesuai dengan rencana eksekusi, ia melakukan pemindaian tabel pada kedua tabel, mendapatkan data yang cocok dan menghapusnya dari tabel Pesanan.

  • Ekspresi tabel umum (CTE)

Kita dapat menggunakan ekspresi tabel umum (CTE) untuk menghapus baris dari tabel SQL juga. Pertama, kita mendefinisikan CTE untuk menemukan baris yang ingin kita hapus.

Kemudian, kita gabungkan CTE dengan tabel SQL Orders dan hapus barisnya.

WITH cteOrders AS (SELECT OrderID FROM Customer WHERE CustomerID = 1 ) DELETE Orders FROM cteOrders sp INNER JOIN dbo.Orders o ON o.orderid = sp.orderid;

Dampak pada rentang identitas

Kolom identitas di SQL Server menghasilkan nilai unik dan berurutan untuk kolom Anda. Mereka digunakan terutama untuk secara unik mengidentifikasi baris dalam tabel SQL. Kolom kunci utama juga merupakan pilihan yang baik untuk indeks berkerumun di SQL Server.

Dalam skrip di bawah ini, kami memiliki tabel [Karyawan]. Tabel ini memiliki id kolom identitas.

Create Table Employee ( id int identity(1,1), [Name] varchar(50) )

Kami memasukkan 50 catatan dalam tabel ini yang menghasilkan nilai identitas untuk kolom id.

Declare @id int=1 While(@id<=50) BEGIN Insert into Employee([Name]) values('Test'+CONVERT(VARCHAR,@ID)) Set @id=@id+1 END

Jika kami menghapus beberapa baris dari tabel SQL, itu tidak mengatur ulang nilai identitas untuk nilai berikutnya. Misalnya, mari kita hapus beberapa baris yang memiliki nilai identitas 20 hingga 25.

Delete from employee where id between 20 and 25

Sekarang, lihat catatan tabel.

Select * from employee where id>15

Ini menunjukkan kesenjangan dalam rentang nilai identitas.

Pernyataan hapus SQL dan log transaksi

SQL menghapus log setiap penghapusan baris dalam log transaksi. Misalkan Anda perlu menghapus jutaan data dari tabel SQL. Anda tidak ingin menghapus sejumlah besar catatan dalam satu transaksi karena dapat menyebabkan file log Anda tumbuh secara eksponensial dan database Anda mungkin tidak tersedia juga. Jika Anda membatalkan transaksi di tengah jalan, diperlukan waktu berjam-jam untuk mengembalikan pernyataan penghapusan.

Dalam hal ini, Anda harus selalu menghapus baris dalam potongan kecil dan melakukan potongan tersebut secara teratur. Misalnya, Anda dapat menghapus kumpulan 10.000 baris sekaligus, mengkomitnya, dan pindah ke kumpulan berikutnya. Ketika SQL Server melakukan chunk, pertumbuhan log transaksi dapat dikontrol.

 Praktik terbaik

  • Anda harus selalu melakukan backup sebelum menghapus data.
  • Secara default, SQL Server menggunakan transaksi implisit dan melakukan catatan tanpa meminta pengguna. Sebagai praktik terbaik, Anda harus memulai transaksi eksplisit menggunakan Begin Transaction. Ini memberi Anda kontrol untuk melakukan atau mengembalikan transaksi. Anda juga harus sering menjalankan pencadangan log transaksi jika database Anda dalam mode pemulihan penuh.
  • Anda ingin menghapus data dalam potongan kecil untuk menghindari penggunaan log transaksi yang berlebihan. Ini juga menghindari pemblokiran untuk transaksi SQL lainnya.
  • Anda harus membatasi izin sehingga pengguna tidak dapat menghapus data. Hanya pengguna yang berwenang yang memiliki akses untuk menghapus data dari tabel SQL.
  • Anda ingin menjalankan pernyataan hapus dengan klausa where. Ini menghapus data yang difilter dari tabel SQL. Jika aplikasi Anda memerlukan penghapusan data yang sering, ada baiknya untuk menyetel ulang nilai identitas secara berkala. Jika tidak, Anda mungkin menghadapi masalah kelelahan nilai identitas.
  • Jika Anda ingin mengosongkan tabel, disarankan untuk menggunakan pernyataan truncate. Pernyataan truncate menghapus semua data dari tabel, menggunakan pencatatan transaksi minimal, menyetel ulang rentang nilai identitas, dan lebih cepat daripada pernyataan hapus SQL karena langsung membatalkan alokasi semua halaman untuk tabel.
  • Jika Anda menggunakan batasan kunci asing (hubungan induk-anak) untuk tabel Anda, Anda harus menghapus baris dari baris anak dan kemudian dari tabel induk. Jika Anda menghapus baris dari baris induk, Anda juga dapat menggunakan opsi cascade on delete untuk menghapus baris secara otomatis dari tabel anak. Anda dapat membaca artikel: Menghapus kaskade dan memperbarui kaskade di kunci asing SQL Server untuk wawasan lebih lanjut.
  • Jika Anda menggunakan pernyataan teratas untuk menghapus baris, SQL Server menghapus baris secara acak. Anda harus selalu menggunakan klausa teratas dengan klausa Order by dan Group by yang sesuai.
  • Pernyataan hapus memperoleh kunci maksud eksklusif pada tabel referensi; oleh karena itu, selama waktu tersebut, tidak ada transaksi lain yang dapat mengubah data. Anda dapat menggunakan petunjuk NOLOCK untuk membaca data.
  • Anda harus menghindari penggunaan petunjuk tabel untuk mengesampingkan perilaku penguncian default dari pernyataan penghapusan SQL; itu hanya boleh digunakan oleh DBA dan pengembang berpengalaman.

Pertimbangan penting

Ada banyak manfaat menggunakan pernyataan hapus SQL untuk menghapus data dari tabel SQL, tetapi seperti yang Anda lihat, ini memerlukan pendekatan metodis. Penting untuk selalu menghapus data dalam batch kecil dan melanjutkan dengan hati-hati saat menghapus data dari instans produksi. Memiliki strategi pencadangan untuk memulihkan data dalam jumlah waktu minimum adalah suatu keharusan untuk menghindari waktu henti atau dampak kinerja di masa mendatang.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menemukan Semua Pelanggaran Batasan di Database SQL Server

  2. Konfigurasikan SQL Server Always ON Availability Groups antara Dua Replika Sinkron. Bagian 2

  3. Mengonversi file SQL2008 RDL ke SQL2005

  4. mengisolasi sub-string dalam string sebelum simbol di SQL Server 2008

  5. Menghitung DISTINCT pada beberapa kolom