Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Các cách tốt nhất để sử dụng câu lệnh SQL DELETE trong bảng SQL

Trong cơ sở dữ liệu quan hệ, chúng tôi tạo các bảng để lưu trữ dữ liệu ở nhiều định dạng khác nhau. SQL Server lưu trữ dữ liệu ở định dạng hàng và cột chứa một giá trị được liên kết với từng kiểu dữ liệu. Khi chúng ta thiết kế bảng SQL, chúng ta xác định các kiểu dữ liệu như số nguyên, số nổi, số thập phân, varchar và bit. Ví dụ:một bảng lưu trữ dữ liệu khách hàng có thể có các trường như tên khách hàng, email, địa chỉ, tiểu bang, quốc gia, v.v. Các lệnh SQL khác nhau được thực hiện trên bảng SQL và có thể được chia thành các loại sau:

  • Ngôn ngữ Định nghĩa Dữ liệu (DDL): Các lệnh này được sử dụng để tạo và sửa đổi các đối tượng cơ sở dữ liệu trong cơ sở dữ liệu.
    • Tạo: Tạo các đối tượng
    • Thay đổi: Sửa đổi các đối tượng
    • Thả: Xóa các đối tượng
    • Cắt ngắn: Xóa tất cả dữ liệu khỏi bảng
  • Ngôn ngữ Thao tác Dữ liệu (DML): Các lệnh này chèn, truy xuất, sửa đổi, xóa và cập nhật dữ liệu trong cơ sở dữ liệu.
    • Chọn: Lấy dữ liệu từ một bảng hoặc nhiều bảng
    • Chèn: Thêm dữ liệu mới vào bảng
    • Cập nhật: Sửa đổi dữ liệu hiện có
    • Xóa: Xóa các bản ghi hiện có trong bảng

  • Ngôn ngữ Kiểm soát Dữ liệu (DCL): Các lệnh này được liên kết với các quyền hoặc điều khiển quyền trong cơ sở dữ liệu.
    • Cấp: Chỉ định quyền cho người dùng
    • Thu hồi: Thu hồi quyền từ người dùng
  • Ngôn ngữ Kiểm soát Giao dịch (TCL): Các lệnh này kiểm soát các giao dịch trong cơ sở dữ liệu.
    • Cam kết: Lưu các thay đổi do truy vấn thực hiện
    • Khôi phục: Quay lại một giao dịch rõ ràng hoặc ngầm định về đầu giao dịch hoặc đến điểm lưu bên trong giao dịch
    • Lưu giao dịch: Đặt điểm lưu hoặc điểm đánh dấu trong giao dịch

Giả sử bạn có dữ liệu đơn đặt hàng của khách hàng được lưu trữ trong bảng SQL. Nếu bạn liên tục chèn dữ liệu vào bảng này, bảng có thể chứa hàng triệu bản ghi, điều này sẽ gây ra các vấn đề về hiệu suất trong các ứng dụng của bạn. Việc duy trì chỉ mục của bạn cũng có thể trở nên cực kỳ tốn thời gian. Thông thường, bạn không cần phải giữ lại các đơn đặt hàng cũ hơn ba năm. Trong những trường hợp này, bạn có thể xóa các bản ghi đó khỏi bảng. Điều này sẽ tiết kiệm không gian lưu trữ cũng như giảm bớt nỗ lực bảo trì của bạn.

Bạn có thể xóa dữ liệu khỏi bảng SQL theo hai cách:

  • Sử dụng câu lệnh xóa SQL
  • Sử dụng dấu cắt ngắn

Chúng ta sẽ xem xét sự khác biệt giữa các lệnh SQL này sau. Đầu tiên chúng ta hãy khám phá câu lệnh xóa SQL.

Câu lệnh xóa SQL không kèm theo bất kỳ điều kiện nào

Trong các câu lệnh của ngôn ngữ thao tác dữ liệu (DML), câu lệnh xóa SQL xóa các hàng khỏi bảng. Bạn có thể xóa một hàng cụ thể hoặc tất cả các hàng. Câu lệnh xóa cơ bản không yêu cầu bất kỳ đối số nào.

Hãy tạo một bảng SQL đơn hàng bằng cách sử dụng tập lệnh bên dưới. Bảng này có ba cột [OrderID], [ProductName] và [ProductQuantity].

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

Chèn một vài bản ghi vào bảng này.

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

Bây giờ, giả sử chúng ta muốn xóa dữ liệu bảng. Bạn có thể chỉ định tên bảng để xóa dữ liệu bằng cách sử dụng câu lệnh xóa. Cả hai câu lệnh SQL đều giống nhau. Chúng tôi có thể chỉ định tên bảng từ từ khóa (tùy chọn) hoặc chỉ định tên bảng ngay sau khi xóa.

Delete Orders Go Delete from Orders GO

Câu lệnh xóa SQL với dữ liệu được lọc

Các câu lệnh xóa SQL này xóa tất cả dữ liệu của bảng. Thông thường, chúng tôi không xóa tất cả các hàng khỏi bảng SQL. Để xóa một hàng cụ thể, chúng ta có thể thêm mệnh đề where với câu lệnh delete. Mệnh đề where chứa các tiêu chí lọc và cuối cùng xác định (các) hàng cần loại bỏ.

Ví dụ:giả sử chúng ta muốn xóa id đơn hàng 1. Khi chúng ta thêm mệnh đề where, SQL Server trước tiên sẽ kiểm tra các hàng tương ứng và xóa các hàng cụ thể đó.
Delete Orders where orderid=1

Nếu điều kiện mệnh đề where là sai, nó không loại bỏ bất kỳ hàng nào. Ví dụ:chúng tôi đã xóa đơn đặt hàng 1 khỏi bảng đơn đặt hàng. Nếu chúng ta thực hiện lại câu lệnh, nó sẽ không tìm thấy bất kỳ hàng nào để thỏa mãn điều kiện mệnh đề where. Trong trường hợp này, nó trả về 0 hàng bị ảnh hưởng.

Câu lệnh xóa SQL và mệnh đề TOP

Bạn cũng có thể sử dụng câu lệnh TOP để xóa các hàng. Ví dụ:truy vấn dưới đây xóa 100 hàng trên cùng khỏi bảng Đơn hàng.

Delete top (100) [OrderID] from Orders

Vì chúng tôi chưa chỉ định bất kỳ ‘ORDER BY’ nào, nó sẽ chọn các hàng ngẫu nhiên và xóa chúng. Chúng ta có thể sử dụng mệnh đề Order by để sắp xếp dữ liệu và xóa các hàng trên cùng. Trong truy vấn bên dưới, nó sắp xếp [OrderID] theo thứ tự giảm dần, sau đó xóa nó khỏi bảng [Đơn hàng].

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

Xóa các hàng dựa trên một bảng khác

Đôi khi chúng ta cần xóa các hàng dựa trên một bảng khác. Bảng này có thể tồn tại trong cùng một cơ sở dữ liệu hoặc không.

  • Tra cứu bảng

Chúng ta có thể sử dụng phương pháp tra cứu bảng hoặc phép nối SQL để xóa các hàng này. Ví dụ:chúng tôi muốn xóa các hàng khỏi bảng [Đơn hàng] thỏa mãn điều kiện sau:

Nó phải có các hàng tương ứng trong bảng [dbo]. [Khách hàng].

Nhìn vào truy vấn dưới đây, ở đây chúng ta có một câu lệnh select trong mệnh đề where của câu lệnh delete. SQL Server trước tiên lấy các hàng thỏa mãn câu lệnh select và sau đó xóa các hàng đó khỏi bảng [Đơn hàng] bằng cách sử dụng câu lệnh xóa SQL.

Delete Orders where orderid in (Select orderid  from Customer)
  • Tham gia SQL

Ngoài ra, chúng ta có thể sử dụng các phép nối SQL giữa các bảng này và loại bỏ các hàng. Trong truy vấn dưới đây, chúng tôi nối các bảng [Đơn hàng]] với bảng [Khách hàng]. Một phép nối SQL luôn hoạt động trên một cột chung giữa các bảng. Chúng tôi có một cột [OrderID] nối cả hai bảng với nhau.

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

Để hiểu câu lệnh xóa ở trên, hãy xem kế hoạch thực thi thực tế.

Theo kế hoạch thực thi, nó thực hiện quét bảng trên cả hai bảng, lấy dữ liệu phù hợp và xóa chúng khỏi bảng Đơn hàng.

  • Biểu thức bảng chung (CTE)

Chúng ta cũng có thể sử dụng một biểu thức bảng chung (CTE) để xóa các hàng khỏi bảng SQL. Đầu tiên, chúng tôi xác định một CTE để tìm hàng mà chúng tôi muốn xóa.

Sau đó, chúng tôi kết hợp CTE với các Đơn đặt hàng trong bảng SQL và xóa các hàng.

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;

Tác động đến phạm vi nhận dạng

Các cột nhận dạng trong SQL Server tạo ra các giá trị tuần tự, duy nhất cho cột của bạn. Chúng được sử dụng chủ yếu để xác định duy nhất một hàng trong bảng SQL. Cột khóa chính cũng là một lựa chọn tốt cho chỉ mục được phân nhóm trong SQL Server.

Trong tập lệnh dưới đây, chúng ta có một bảng [Nhân viên]. Bảng này có id cột nhận dạng.

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

Chúng tôi đã chèn 50 bản ghi vào bảng này để tạo ra các giá trị nhận dạng cho cột id.

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

Nếu chúng ta xóa một vài hàng khỏi bảng SQL, nó không đặt lại giá trị nhận dạng cho các giá trị tiếp theo. Ví dụ:hãy xóa một vài hàng có giá trị nhận dạng từ 20 đến 25.

Delete from employee where id between 20 and 25

Bây giờ, hãy xem các bản ghi bảng.

Select * from employee where id>15

Nó cho thấy khoảng cách trong phạm vi giá trị nhận dạng.

Câu lệnh xóa SQL và nhật ký giao dịch

Nhật ký xóa SQL ghi mỗi lần xóa hàng trong nhật ký giao dịch. Giả sử bạn cần xóa hàng triệu bản ghi khỏi bảng SQL. Bạn không muốn xóa một số lượng lớn các bản ghi trong một giao dịch vì nó có thể khiến tệp nhật ký của bạn phát triển theo cấp số nhân và cơ sở dữ liệu của bạn cũng có thể không khả dụng. Nếu bạn hủy giao dịch giữa chừng, có thể mất hàng giờ để khôi phục lại một bản sao kê đã xóa.

Trong trường hợp này, bạn phải luôn xóa các hàng theo từng phần nhỏ và thực hiện thường xuyên các phần đó. Ví dụ:bạn có thể xóa hàng loạt 10.000 hàng cùng một lúc, cam kết và chuyển sang lô tiếp theo. Khi SQL Server thực hiện phân đoạn, có thể kiểm soát sự tăng trưởng của nhật ký giao dịch.

Các phương pháp hay nhất

  • Bạn luôn phải thực hiện sao lưu trước khi xóa dữ liệu.
  • Theo mặc định, SQL Server sử dụng các giao dịch ngầm và cam kết các bản ghi mà không cần hỏi người dùng. Phương pháp hay nhất là bạn nên bắt đầu một giao dịch rõ ràng bằng cách sử dụng Bắt đầu giao dịch. Nó cung cấp cho bạn quyền kiểm soát để cam kết hoặc khôi phục giao dịch. Bạn cũng nên chạy sao lưu nhật ký giao dịch thường xuyên nếu cơ sở dữ liệu của bạn ở chế độ khôi phục hoàn toàn.
  • Bạn muốn xóa dữ liệu theo từng phần nhỏ để tránh sử dụng quá nhiều nhật ký giao dịch. Nó cũng tránh bị chặn đối với các giao dịch SQL khác.
  • Bạn nên hạn chế quyền để người dùng không thể xóa dữ liệu. Chỉ những người dùng được ủy quyền mới có quyền truy cập để xóa dữ liệu khỏi bảng SQL.
  • Bạn muốn chạy câu lệnh xóa với mệnh đề where. Nó loại bỏ dữ liệu đã lọc khỏi bảng SQL. Nếu ứng dụng của bạn yêu cầu xóa dữ liệu thường xuyên, bạn nên đặt lại các giá trị nhận dạng theo định kỳ. Nếu không, bạn có thể phải đối mặt với vấn đề cạn kiệt giá trị nhận dạng.
  • Trong trường hợp bạn muốn làm trống bảng, bạn nên sử dụng câu lệnh cắt ngắn. Câu lệnh truncate xóa tất cả dữ liệu khỏi bảng, sử dụng ghi nhật ký giao dịch tối thiểu, đặt lại phạm vi giá trị nhận dạng và nhanh hơn câu lệnh xóa SQL vì nó phân bổ tất cả các trang cho bảng ngay lập tức.
  • Trong trường hợp bạn sử dụng các ràng buộc khóa ngoại (mối quan hệ mẹ-con) cho các bảng của mình, bạn nên xóa hàng khỏi hàng con rồi xóa khỏi bảng mẹ. Nếu bạn xóa hàng khỏi hàng mẹ, bạn cũng có thể sử dụng tùy chọn xếp tầng khi xóa để tự động xóa hàng khỏi bảng con. Bạn có thể tham khảo bài viết:Xóa cascade và cập nhật cascade trong khóa ngoại SQL Server để có thêm hiểu biết.
  • Nếu bạn sử dụng câu lệnh trên cùng để xóa các hàng, SQL Server sẽ xóa các hàng một cách ngẫu nhiên. Bạn nên luôn sử dụng mệnh đề trên cùng với mệnh đề Order by và Group by tương ứng.
  • Câu lệnh xóa có được một khóa ý định độc quyền trên bảng tham chiếu; do đó, trong thời gian đó, không có giao dịch nào khác có thể sửa đổi dữ liệu. Bạn có thể sử dụng gợi ý NOLOCK để đọc dữ liệu.
  • Bạn nên tránh sử dụng gợi ý bảng để ghi đè hành vi khóa mặc định của câu lệnh xóa SQL; nó chỉ nên được sử dụng bởi các DBA và nhà phát triển có kinh nghiệm.

Những cân nhắc quan trọng

Có nhiều lợi ích khi sử dụng câu lệnh SQL delete để xóa dữ liệu khỏi bảng SQL, nhưng như bạn thấy, nó yêu cầu một cách tiếp cận có phương pháp. Điều quan trọng là phải luôn xóa dữ liệu theo từng đợt nhỏ và tiến hành thận trọng khi xóa dữ liệu khỏi phiên bản sản xuất. Phải có chiến lược sao lưu để khôi phục dữ liệu trong khoảng thời gian tối thiểu để tránh thời gian ngừng hoạt động hoặc ảnh hưởng đến hiệu suất trong tương lai.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có thể thực hiện nhiều cập nhật chỉ với một câu lệnh CẬP NHẬT SQL không?

  2. Định cấu hình công việc SQL trong SQL Server bằng T-SQL

  3. Cách xác định khóa chính tự động tăng dần trong SQL Server

  4. Vô hiệu hoá Tài khoản SA trong SQL Server (Ví dụ T-SQL)

  5. Tổng tích lũy SQL Server theo nhóm