Bài viết hiện tại tập trung vào việc sử dụng câu lệnh DELETE nâng cao một chút để xóa một hoặc nhiều bản ghi (hàng) khỏi bảng. Mặc dù chủ yếu nhắm mục tiêu đến người mới bắt đầu, nhưng các mẹo của nó có thể hữu ích cho tất cả các chuyên gia cơ sở dữ liệu.
Điều kiện tiên quyết:câu lệnh DELETE Các trường hợp cơ bản
Nếu bạn chưa quen với cách sử dụng cơ bản của câu lệnh Delete, chúng tôi khuyên bạn nên xem lại bài viết trước SQL Server DELETE - Xóa một hoặc nhiều hàng khỏi bảng. Bài viết đó tập trung vào các khía cạnh sau:
- Thiết lập cơ sở dữ liệu mẫu.
- Chạy các tập lệnh SQL dựa trên cơ sở dữ liệu mẫu.
- Tạo bảng trong cơ sở dữ liệu mẫu và chèn dữ liệu vào đó.
- Xóa tất cả các hàng khỏi bảng.
- Xóa một hoặc nhiều hàng khỏi bảng dựa trên một điều kiện.
- Xóa một hoặc nhiều hàng khỏi bảng dựa trên nhiều điều kiện.
Những dữ liệu này rất quan trọng cần nắm được trước khi chúng ta chuyển sang cách sử dụng câu lệnh Delete nâng cao một chút, vì vậy, hãy xem lại bài viết đó nếu bạn chưa có kiến thức cơ bản cần thiết cho đến nay.
Các tình huống hơi nâng cao cho câu lệnh DELETE
Như với bất kỳ hướng dẫn nào khác, trước tiên chúng ta phải thiết lập một cơ sở dữ liệu mẫu để kiểm tra việc chạy các tập lệnh của chúng ta dựa trên nó một cách an toàn.
Mẹo về thiết lập cơ sở dữ liệu mẫu
Tôi thực sự khuyên bạn nên cài đặt SQL Server Developer Edition trên máy của bạn cục bộ trước. Nó tốt hơn cho mục đích học tập và thử nghiệm.
Tải xuống phiên bản dành cho nhà phát triển SQL Server
Thiết lập cơ sở dữ liệu mẫu (WatchesDelSample)
Chúng ta sẽ thiết lập một cơ sở dữ liệu có tên là WatchesDelSample. Cơ sở dữ liệu này chứa ba bảng sau:
- Xem.
- Màu sắc.
- WatchType.
Bảng Watch là bảng chính. Nó chứa Tên, Màu và Loại của đồng hồ. Thông tin về cả loại và màu đến từ hai bảng tham chiếu Màu và WatchType được kết nối thông qua khóa ngoại.
Thiết lập cơ sở dữ liệu mẫu với tập lệnh sau:
-- 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
Kiểm tra dữ liệu nhanh
Hãy để chúng tôi xem tất cả các hàng của Đồng hồ bàn. Đối với điều đó, hãy chạy tập lệnh sau:
-- View the watch table data (rows)
SELECT w.WatchId
,w.Name
,w.WatchTypeId
,w.ColorId
,w.Price FROM dbo.Watch w
Kết quả như sau:
Lưu ý rằng tôi đang sử dụng dbForge Studio cho SQL Server cho bản trình diễn này. Tuy nhiên, bạn có thể sử dụng SQL Server Management Studio (SSMS) để chạy các tập lệnh giống nhau - kết quả sẽ giống nhau.
Hiểu các ID (mã) đằng sau các Cột Loại và Màu
Như bạn có thể thấy, có một số ID dưới các cột sau của bảng Xem:
- WatchTypeId
- ColorId
Các cột này nhận giá trị từ các bảng tham chiếu mà chúng được xác định ban đầu. Bảng Xem kết nối với các bảng tham chiếu đó thông qua các ràng buộc khóa ngoại.
Ba vấn đề xảy ra với đầu ra ở trên:
- Chúng tôi có thể thấy WatchTypeId và ColorId nhưng không hiểu chúng là gì.
- Nếu chúng tôi hiểu ý nghĩa của những id này, chúng tôi phải quay lại bảng ban đầu của chúng để kiểm tra.
- Quan trọng nhất, tại sao chúng ta cần lấy Màu và Loại từ các bảng khác?
Có một lý do tại sao chúng tôi xác định Màu (ColorId) và Loại (WatchTypeId) trong các bảng khác. Chúng tôi cần đảm bảo rằng các giá trị này vẫn nhất quán.
Nếu ban đầu chúng tôi không xác định giá trị trong các bảng tham chiếu, chúng tôi có thể đã trộn các từ để thể hiện màu sắc hoặc loại. Ví dụ:có thể có cả Màu xanh lam và Blues hoặc Tương tự và Tương tự . Để tránh vấn đề như vậy, chúng tôi chuẩn hóa màu sắc và kiểu trong các bảng tham chiếu. Sau đó, chúng tôi chuyển mã của họ vào bảng chính.
Bằng cách kết hợp bảng Xem với các bảng tham chiếu khác, chúng tôi có thể truy xuất các giá trị đằng sau các mã này. Đây là một thực tế phổ biến trong phát triển cơ sở dữ liệu.
Xem bảng Xem với các giá trị Loại và Màu phía sau ID
Chúng ta có thể xem ý nghĩa thực tế của các mã đằng sau Màu sắc và Loại bằng cách thực thi tập lệnh sau:
-- 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
Kết quả như sau:
Hiểu kiến trúc cơ sở dữ liệu
Chúng tôi cần thêm thông tin về kiến trúc của cơ sở dữ liệu này. Trọng tâm của chúng tôi là cách các bảng liên kết với nhau.
Hình ảnh trên minh họa kịch bản của các bảng tham chiếu giúp bảng chính nhận dữ liệu nhất quán. Đây không phải là một kịch bản đơn giản, đặc biệt đối với người mới bắt đầu, mặc dù nó phổ biến trong nhiều cơ sở dữ liệu.
Chúng tôi đang nghiên cứu kiến trúc này vì chúng tôi cần hiểu cách xóa một hoặc nhiều hàng khỏi bất kỳ bảng nào ở trên khi chúng được liên kết như thế này.
Xóa một hàng khỏi bảng (Màu) tham chiếu
Chúng ta có thể xóa một hàng khỏi bảng tham chiếu hay không? Hãy cùng chúng tôi tìm ra câu trả lời.
Chúng tôi xóa hàng đầu tiên khỏi bảng Màu:
-- Deleting one row with color id 1 from the reference table color
DELETE FROM Color
WHERE ColorId = 1
Kết quả như sau:
Lỗi có nghĩa là không được phép xóa hàng mà chúng tôi muốn.
Nói cách khác, chúng tôi không thể xóa một hàng khỏi bảng đang được tham chiếu bởi một bảng khác.
Hàng được liên kết so với Hàng không được liên kết
Hãy chia các hàng của bảng tham chiếu thành hai loại sau:
- Các hàng được liên kết.
- Các hàng được hủy liên kết.
Một hàng được liên kết là một hàng của bảng tham chiếu được sử dụng bởi một bảng khác. Một hàng không được liên kết là một hàng của bảng tham chiếu mà một bảng khác không hấp dẫn.
Chúng tôi có thể xóa các hàng (bản ghi) chưa được liên kết của bảng tham chiếu ngay lập tức.
Nỗ lực xóa một hàng khỏi bảng Màu trước đó của chúng tôi không thành công vì ColorId (1) đó đang được sử dụng trong bảng Xem chính.
Xem Bảng Tham chiếu (Màu)
Hãy để chúng tôi xem bảng tham chiếu như sau:
-- View reference table Color
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
Tập hợp kết quả dưới đây:
Từ các kết quả đầu ra trước đó, chúng tôi biết rằng màu Xanh lam (ColorId:3) không được sử dụng bởi bảng Đồng hồ vì chưa có đồng hồ màu xanh lam nào được lưu trữ trong bảng.
Xóa một hàng chưa được liên kết khỏi bảng (Màu) tham chiếu
Thực thi tập lệnh sau:
-- Deleting unlinked row with color id 3 from reference table Color
DELETE FROM Color
WHERE ColorId = 3 -- blue color
Chúng tôi đã xóa hàng thành công và chúng tôi có thể xác nhận hàng bằng cách xem bảng:
--View reference table Color after deleting the unlinked row
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
Tập hợp kết quả dưới đây:
Nó cho thấy rằng hàng có chứa màu xanh lam màu đã được xóa thành công khỏi bảng.
Mẹo về cách xóa dữ liệu khỏi bảng tham chiếu
Hãy nhớ rằng bạn không thể xóa một bản ghi (hàng) khỏi một bảng tham chiếu nếu nó đang được sử dụng cho một bảng hoặc một nhóm bảng khác. Tuy nhiên, bạn có thể xóa một bản ghi khỏi cùng một bảng (tham chiếu) nếu nó không được sử dụng.
Xóa hàng được liên kết khỏi bảng (Màu) tham chiếu
Điều gì sẽ xảy ra nếu chúng ta muốn xóa một hàng khỏi bảng tham chiếu biết rằng nó chuyển dữ liệu tham chiếu chẳng hạn như màu sắc sang một bảng khác? Nói cách khác, làm cách nào để xóa một hàng được liên kết khỏi bảng tham chiếu?
Đầu tiên, chúng ta phải xóa hàng đó khỏi bảng chính nơi nó được tham chiếu.
Ví dụ:chúng tôi có thể xóa màu Trắng từ bảng Màu như sau:
- Xóa tất cả các hàng khỏi bảng chính (Xem) có màu là Trắng (dựa trên id).
- Xóa hàng khỏi bảng Màu tham chiếu trong đó màu là Trắng (dựa trên id).
Bây giờ, hãy kiểm tra nó trong thực tế.
Xóa tất cả các hàng có màu Trắng khỏi bảng (Xem) chính
Mục tiêu của chúng tôi là xóa dấu vết của màu trắng màu từ cả bảng tham chiếu và bảng chính.
Hãy xem xét dữ liệu trước khi xóa nó. Chúng tôi muốn kiểm tra xem có bao nhiêu hàng từ bảng chính chứa id màu 2 (trắng):
-- 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
Kết quả là bên dưới:
Bây giờ, hãy xóa các hàng có id màu 2 bằng cách chạy tập lệnh T-SQL sau:
-- Deleting all the rows with color id 2 from main table Watch
DELETE FROM dbo.Watch
WHERE ColorId = 2 -- white color
Kết quả như sau:
Xem bảng chính sau khi xóa tất cả các hàng có màu trắng
Chúng ta cần kiểm tra bảng chính xem có hàng nào chứa id màu 2 không:
-- 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
Như chúng ta thấy, các kỷ lục về đồng hồ màu trắng không có. Điều đó chứng tỏ rằng chúng tôi đã xóa thành công tất cả các hàng đó.
Xóa hàng đã liên kết trước đó khỏi bảng tham chiếu (Màu)
Sau khi chúng tôi xóa các hàng được tham chiếu khỏi bảng chính, chúng tôi cũng có thể xóa hàng được liên kết trước đó khỏi bảng tham chiếu. Thực tế là, liên kết đó bây giờ không còn ở đó nữa.
Chạy tập lệnh sau đối với bảng Màu tham chiếu để xóa hàng có id màu 2 (trắng):
-- 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
Kết quả như sau:
Xin chúc mừng!
Chúng tôi đã học cách xóa một hoặc nhiều hàng khỏi bảng tham chiếu. Chúng ta có thể làm điều đó cả nếu hàng đang được tham chiếu và nếu không. Ngoài ra, chúng tôi đã kiểm tra việc xóa các hàng khỏi bảng chính.
Mẹo về cách xóa tất cả dữ liệu
Có một câu lệnh T-SQL khác được gọi là Bảng cắt ngắn - hiệu quả hơn khi xóa tất cả dữ liệu khỏi bảng. Tuy nhiên, bảng không được tham chiếu ở nơi khác vì sau đó bạn phải xóa dữ liệu khỏi bảng chính trước. Nó giống như chúng tôi đã trình bày trong bài viết này trước đó. Sau đó, chúng tôi sẽ áp dụng Cắt ngắn tuyên bố đối với bảng tham chiếu như một bước cuối cùng.
Mã như sau:
-- Deleting all rows from the main table using Truncate
TRUNCATE TABLE dbo.Watch
Tuy nhiên, giống như với câu lệnh Delete, bạn phải rất cẩn thận với Cắt ngắn hoặc bạn sẽ xóa tất cả dữ liệu khỏi bảng.
Lời khuyên
Việc xóa các hàng trong các kịch bản thời gian thực hầu hết giúp chúng tôi xóa dữ liệu không mong muốn (chẳng hạn như các mô hình đã ngừng hoạt động) khỏi cơ sở dữ liệu chính hoặc để lưu trữ dữ liệu và lưu trữ trong cơ sở dữ liệu lưu trữ.
Việc cần làm
Giờ đây, bạn có thể xóa một hoặc nhiều hàng trong các trường hợp hơi nâng cao, chẳng hạn như các bảng được liên kết, hãy thử những điều sau để cải thiện kỹ năng của bạn hơn nữa:
- Xóa loại đồng hồ Analog khỏi bảng tham chiếu WatchType dựa trên ID.
- Xóa tất cả các hàng khỏi Màu bảng tham chiếu.
- Thử đặt lại cơ sở dữ liệu mẫu, sau đó xem bạn có thể xóa tất cả dữ liệu khỏi tất cả các bảng (tham chiếu và chính) nhanh như thế nào.