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

SQL Server DELETE – Menghapus Satu atau Lebih Baris dari Tabel dengan Skenario Sedikit Lanjut

Artikel saat ini berfokus pada penggunaan pernyataan DELETE yang sedikit lebih maju untuk menghapus satu atau beberapa rekaman (baris) dari tabel. Meskipun sebagian besar menargetkan pemula, kiatnya dapat membantu semua spesialis basis data.

Prasyarat:pernyataan DELETE Skenario Dasar

Jika Anda belum terbiasa dengan penggunaan dasar pernyataan Hapus, kami sarankan Anda meninjau artikel sebelumnya SQL Server DELETE – Menghapus Satu atau Lebih Baris dari Tabel. Artikel tersebut berfokus pada aspek-aspek berikut:

  1. Menyiapkan contoh database.
  2. Menjalankan skrip SQL terhadap database sampel.
  3. Membuat tabel dalam database sampel dan memasukkan data ke dalamnya.
  4. Menghapus semua baris dari tabel.
  5. Menghapus satu atau beberapa baris dari tabel berdasarkan kondisi.
  6. Menghapus satu atau beberapa baris dari tabel berdasarkan beberapa kondisi.

Data ini sangat penting untuk dipahami sebelum kita beralih ke penggunaan pernyataan Hapus yang sedikit maju, jadi, tinjau artikel itu jika Anda tidak memiliki latar belakang yang diperlukan sejauh ini.

Skenario Sedikit Lanjutan untuk pernyataan DELETE

Seperti penelusuran lainnya, pertama-tama kita harus menyiapkan database sampel untuk menguji menjalankan skrip kita dengan aman.

Kiat tentang contoh penyiapan basis data

Saya sangat merekomendasikan menginstal SQL Server Developer Edition pada mesin Anda secara lokal terlebih dahulu. Lebih baik untuk tujuan pembelajaran dan pengujian.

Unduhan edisi pengembang SQL Server

Menyiapkan Contoh Basis Data (WatchesDelSample)

Kita akan menyiapkan database bernama WatchesDelSample. Basis data ini berisi tiga tabel berikut:

  1. Tonton.
  2. Warna.
  3. Jenis Jam Tangan.

Meja Watch adalah yang utama. Ini berisi Nama, Warna, dan Jenis jam tangan. Informasi tentang jenis dan warna berasal dari dua tabel referensi Warna dan Jenis Jam Tangan terhubung melalui kunci asing.

Siapkan database sampel dengan skrip berikut:

-- Create sample database WatchesDelSample
USE MASTER
GO

CREATE DATABASE WatchesDelSample
GO

USE WatchesDelSample

-- Creating a reference table WatchType
CREATE TABLE dbo.WatchType
(
	WatchTypeId INT IDENTITY(1,1),
	Name VARCHAR(50)NOT NULL,
	Detail VARCHAR(200)NULL 
	CONSTRAINT PK_WatchType_WatchTypeId PRIMARY KEY (WatchTypeId)
)
GO

-- Populating (adding rows to the) table WatchType
SET IDENTITY_INSERT dbo.WatchType ON
GO
INSERT INTO dbo.WatchType
(
  WatchTypeId
 ,Name
 ,Detail
)
VALUES
(
  1  -- ID - INT Primary Key
 ,'Analogue' -- Name - varchar(50) NOT NULL
 ,'This is Analogue' -- Detail - varchar(200)
),
(
  2  -- ID - INT Primary Key
 ,'Digital' -- Name - varchar(50) NOT NULL
 ,'This is Digital' -- Detail - varchar(200)
),
(
  3  -- ID - INT Primary Key
 ,'Sports' -- Name - varchar(50) NOT NULL
 ,'This is Sports' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.WatchType OFF
GO

-- Creating a reference table Color
CREATE TABLE dbo.Color
(
	ColorId INT IDENTITY(1,1),
	Name VARCHAR(50)NOT NULL,
	Detail VARCHAR(200)NULL 
	CONSTRAINT PK_Color_ColorId PRIMARY KEY (ColorId)
)
GO

-- Populating (adding rows to the) table Color
SET IDENTITY_INSERT dbo.Color ON
GO
INSERT INTO dbo.Color
(
  ColorId
 ,Name
 ,Detail
)
VALUES
(
  1  -- ID - INT Primary Key
 ,'Black' -- Name - varchar(50) NOT NULL
 ,'This is Black' -- Detail - varchar(200)
),
(
  2  -- ID - INT Primary Key
 ,'White' -- Name - varchar(50) NOT NULL
 ,'This is White' -- Detail - varchar(200)
),
(
  3  -- ID - INT Primary Key
 ,'Blue' -- Name - varchar(50) NOT NULL
 ,'This is Blue' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.Color OFF
GO

-- Creating a table Watch
CREATE TABLE dbo.Watch
(
	WatchId INT IDENTITY(1,1),
	Name VARCHAR(50),
	WatchTypeId INT,
	ColorId INT,
	Price DECIMAL(5,2),		
	CONSTRAINT PK_Watch_WatchId PRIMARY KEY (WatchId)
)
GO

-- Creating foreign key constraint on Watch table to get WatchTypeId values from WatchType table
ALTER TABLE dbo.Watch
    ADD CONSTRAINT [FK_Watch_WatchType_WatchTypeId] 
FOREIGN KEY ([WatchTypeId]) REFERENCES dbo.[WatchType] ([WatchTypeId]);

-- Creating foreign key constraint on Watch table to get ColorId values from Color table
ALTER TABLE dbo.Watch
    ADD CONSTRAINT [FK_Watch_Color_ColorId] 
FOREIGN KEY ([ColorId]) REFERENCES dbo.[Color] ([ColorId]);


-- Populating (adding rows to the) table Watch getting some columns values from reference tables
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch ON
GO
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (1, 'Casio', 1, 1, 100.00)
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (2, 'Timex', 2, 2, 70.00)
GO
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch OFF
GO

Pemeriksaan Data Cepat

Mari kita lihat semua baris Jam Tangan meja. Untuk itu, jalankan script berikut:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,w.WatchTypeId
      ,w.ColorId
      ,w.Price FROM dbo.Watch w

Outputnya adalah sebagai berikut:

Perhatikan bahwa saya menggunakan dbForge Studio untuk SQL Server untuk demo ini. Namun, Anda dapat menggunakan SQL Server Management Studio (SSMS) untuk menjalankan skrip yang sama – hasilnya akan sama.

Memahami ID (kode) di balik Kolom Jenis dan Warna

Seperti yang Anda lihat, ada beberapa ID di bawah kolom tabel Tontonan berikut:

  1. WatchTypeId
  2. Id Warna

Kolom ini mendapatkan nilai dari tabel referensi di mana mereka awalnya didefinisikan. Tabel Tonton terhubung ke tabel referensi tersebut melalui batasan kunci asing.

Tiga masalah terjadi dengan output di atas:

  1. Kita bisa melihat WatchTypeId dan ColorId tapi tidak mengerti apa itu.
  2. Jika kita memahami apa arti id ini, kita harus kembali ke tabel aslinya setiap saat untuk memeriksa.
  3. Yang terpenting, mengapa kita perlu mendapatkan Warna dan Jenis dari tabel lain?

Ada alasan mengapa kami mendefinisikan Warna (ColorId) dan Jenis (WatchTypeId) di tabel lain. Kita perlu memastikan bahwa nilai-nilai ini tetap konsisten.

Jika awalnya kita tidak mendefinisikan nilai dalam tabel referensi, kita bisa saja mencampur kata-kata untuk mewakili warna atau tipe. Misalnya, mungkin ada keduanya Biru dan Biru , atau Analog dan Analog . Untuk menghindari masalah seperti itu, kami menstandardisasi warna dan tipe dalam tabel referensi. Kemudian kami meneruskan kode mereka ke tabel utama.

Dengan menggabungkan tabel Watch dengan tabel referensi lain, kita dapat mengambil nilai di balik kode-kode ini. Ini adalah praktik umum dalam pengembangan basis data.

Melihat tabel Tontonan dengan nilai Jenis dan Warna di belakang ID

Kita dapat melihat arti sebenarnya dari kode di balik Warna dan Jenis dengan menjalankan skrip berikut:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,wt.Name AS WatchType
      ,c.Name AS ColorName
      ,w.Price FROM dbo.Watch w
  INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
  INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId

Hasilnya adalah sebagai berikut:

Memahami Arsitektur Basis Data

Kami membutuhkan informasi lebih lanjut tentang arsitektur database ini. Fokus kami adalah bagaimana tabel terhubung satu sama lain.

Gambar di atas menunjukkan skenario tabel referensi yang membantu tabel utama menerima data yang konsisten. Ini bukan skenario sederhana terutama untuk pemula, meskipun ini umum terjadi di banyak database.

Kami mempelajari arsitektur ini karena kami perlu memahami cara menghapus satu atau lebih baris dari tabel mana pun di atas saat mereka ditautkan seperti ini.

Menghapus baris dari tabel referensi (Warna)

Bisakah kita menghapus satu baris dari tabel referensi atau tidak? Mari kita cari tahu jawabannya.

Kami menghapus baris pertama dari tabel Warna:

-- Deleting one row with color id 1 from the reference table color 
DELETE FROM Color
WHERE ColorId = 1

Hasilnya adalah sebagai berikut:

Kesalahan berarti tidak diizinkan untuk menghapus baris yang kita inginkan.

Dengan kata lain, kita tidak dapat menghapus baris dari tabel yang direferensikan oleh tabel lain.

Baris Tertaut vs Baris Tidak Tertaut

Mari kita bagi baris tabel referensi ke dalam dua kategori berikut:

  1. Baris tertaut.
  2. Baris tidak tertaut.

Baris tertaut adalah baris tabel referensi yang digunakan oleh tabel lain. Baris yang tidak ditautkan adalah baris tabel referensi yang tidak menarik bagi tabel lain.

Kami dapat langsung menghapus baris (rekaman) tabel referensi yang tidak tertaut.

Upaya kami sebelumnya untuk menghapus satu baris dari tabel Warna gagal karena ColorId (1) itu sedang menggunakan tabel Tontonan utama.

Lihat Tabel Referensi (Warna)

Mari kita lihat tabel referensi sebagai berikut:

-- View reference table Color
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

Kumpulan hasil di bawah ini:

Dari output sebelumnya, kita mengetahui bahwa warna Biru (ColorId:3) tidak digunakan oleh tabel Watch karena belum ada jam biru yang tersimpan di tabel tersebut.

Menghapus baris yang tidak terhubung dari tabel referensi (Warna)

Jalankan script berikut:

-- Deleting unlinked row with color id 3 from reference table Color
DELETE FROM Color
WHERE ColorId = 3 -- blue color

Kami telah berhasil menghapus baris, dan kami dapat mengonfirmasinya dengan melihat tabel:

--View reference table Color after deleting the unlinked row
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

Kumpulan hasil di bawah ini:

Ini menunjukkan bahwa baris yang berisi biru warna telah berhasil dihapus dari tabel.

Kiat tentang penghapusan data dari tabel referensi

Ingat bahwa Anda tidak dapat menghapus catatan (baris) dari tabel referensi jika sedang menggunakan tabel atau grup tabel lain. Namun, Anda dapat menghapus catatan dari tabel (referensi) yang sama jika tidak digunakan.

Menghapus baris tertaut dari tabel referensi (Warna)

Bagaimana jika kita ingin menghapus baris dari tabel referensi mengetahui bahwa itu melewati data referensi seperti warna ke tabel lain? Dengan kata lain, bagaimana cara menghapus baris tertaut dari tabel referensi?

Pertama, kita harus menghapus baris tersebut dari tabel utama yang menjadi referensinya.

Misalnya, kita dapat menghapus warna Putih dari tabel Warna sebagai berikut:

  1. Hapus semua baris dari tabel utama (Jam Tangan) yang berwarna Putih (berdasarkan id).
  2. Hapus baris dari tabel Warna referensi yang warnanya Putih (berdasarkan id).

Sekarang, mari kita periksa dalam praktiknya.

Menghapus semua baris yang berwarna Putih dari tabel (Jam Tangan) utama

Tujuan kami adalah menghilangkan jejak putih warna dari tabel referensi dan tabel utama.

Mari kita lihat datanya sebelum menghapusnya. Kami ingin memeriksa berapa banyak baris dari tabel utama yang berisi id warna 2 (putih):

-- View Watch table before deleting rows with white color (color id:2)
 SELECT w.WatchId
       ,w.Name
       ,w.WatchTypeId
       ,w.ColorId
       ,w.Price FROM dbo.Watch w
  WHERE w.ColorId=2 -- White Color

Hasilnya di bawah ini:

Sekarang, hapus baris yang memiliki id warna 2 dengan menjalankan skrip T-SQL berikut:

-- Deleting all the rows with color id 2 from main table Watch
DELETE FROM dbo.Watch
WHERE ColorId = 2 -- white color 

Outputnya adalah sebagai berikut:

Lihat tabel utama setelah menghapus semua baris dengan warna putih

Kita perlu memeriksa tabel utama untuk setiap baris yang berisi id warna 2:

-- View the watch table data (rows)
SELECT w.WatchId
      ,w.Name
      ,wt.Name AS WatchType
      ,w.ColorId 
      ,c.Name AS ColorName
      ,w.Price FROM dbo.Watch w
  INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
  INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId

Seperti yang kita lihat, catatan untuk jam tangan warna putih tidak ada. Ini membuktikan bahwa kami telah berhasil menghapus semua baris tersebut.

Menghapus baris yang sebelumnya ditautkan dari tabel referensi (Warna)

Setelah kami menghapus baris yang direferensikan dari tabel utama, kami juga dapat menghapus baris yang ditautkan sebelumnya dari tabel referensi. Faktanya, tautan itu sekarang sudah tidak ada lagi.

Jalankan skrip berikut terhadap tabel Warna referensi untuk menghapus baris dengan id warna 2 (putih):

-- View reference table before removing color id 1 (white)
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

-- Deleting one row with color id 2 from the reference table color 
DELETE FROM Color
WHERE ColorId = 2 -- White Color

  -- View reference table after removing color id 1 (white)
SELECT c.ColorId
      ,c.Name
      ,c.Detail FROM dbo.Color c

Outputnya adalah sebagai berikut:

Selamat!

Kami telah mempelajari cara menghapus satu atau lebih baris dari tabel referensi. Kita bisa melakukannya baik jika baris sedang direferensikan dan jika tidak. Selain itu, kami telah memeriksa penghapusan baris dari tabel utama.

Kiat tentang menghapus semua data

Ada pernyataan T-SQL lain yang dikenal sebagai Truncate Table – lebih efisien untuk menghapus semua data dari tabel. Namun, tabel tersebut tidak boleh direferensikan ke tempat lain karena kemudian Anda harus menghapus data dari tabel utama terlebih dahulu. Ini sama seperti yang kami tunjukkan dalam artikel ini sebelumnya. Kemudian, kita akan menerapkan Truncate pernyataan terhadap tabel referensi sebagai langkah terakhir.

Kodenya adalah sebagai berikut:

-- Deleting all rows from the main table using Truncate 
  TRUNCATE TABLE dbo.Watch

Namun, seperti halnya pernyataan Hapus, Anda harus sangat berhati-hati dengan Truncate , atau Anda akan menghapus semua data dari tabel.

Kata Nasihat

Penghapusan baris dalam skenario waktu nyata sebagian besar membantu kami untuk menghapus data yang tidak diinginkan (seperti model yang sudah tidak digunakan) dari database utama atau untuk mengarsipkan data dan menyimpannya dalam database arsip.

Hal yang harus dilakukan

Sekarang Anda dapat menghapus satu atau beberapa baris dalam skenario yang sedikit lebih maju seperti tabel tertaut, coba hal-hal berikut untuk meningkatkan keterampilan Anda lebih lanjut:

  1. Hapus jenis jam tangan Analog dari tabel referensi Jenis Jam berdasarkan ID.
  2. Hapus semua baris dari Warna tabel referensi.
  3. Coba setel ulang database sampel dan lihat seberapa cepat Anda dapat menghapus semua data dari semua tabel (referensi dan utama).

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hitung hash MD5 dari string UTF8

  2. Skalar UDF Inlining di SQL Server 2019

  3. Sisipkan massal dengan kualifikasi teks di SQL Server

  4. Cara Menghapus File Data dari Database SQL Server (T-SQL)

  5. Atur susunan basis data dalam Entity Framework Code-First Initializer