Câu lệnh SQL DROP TABLE dùng để xóa bảng khỏi cơ sở dữ liệu. Nó loại bỏ bảng và dữ liệu và chỉ mục liên quan đến nó. Tuyên bố là không thể thay đổi. Do đó, bạn chỉ có thể khôi phục bảng bằng cách khôi phục bản sao lưu.
Bài viết này đề cập đến các trường hợp sau:
- Xóa một hoặc nhiều bảng.
- Xóa bảng được sử dụng trong Chế độ xem.
- Xóa bảng có khóa ngoại.
- Xóa bảng có các chỉ mục được phân nhóm và không được phân nhóm.
- Xóa bảng khỏi thiết lập sao chép.
Cú pháp của câu lệnh DROP TABLE như sau:
IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]
Lưu ý:Nếu bạn đang sử dụng SQL Server 2016 trở lên, bạn có thể chỉ định NẾU TỒN TẠI trước DROP TABLE tuyên bố.
Ngoài ra, bạn chỉ định tên bảng sau câu lệnh DROP TABLE. Định dạng tên bảng phải là [Tên cơ sở dữ liệu]. [Tên lược đồ]. [Tên bảng].
Một ví dụ đơn giản về câu lệnh DROP TABLE
Đối với phần trình diễn, tôi đã khôi phục AdventureWorks2017 cơ sở dữ liệu trên máy trạm của tôi. Tại đây, tôi sẽ xóa nhân viên bảng.
Sử dụng truy vấn sau được sử dụng để bỏ bảng:
DROP TABLE [AdventureWorks2017].[dbo].[employees]
Tôi đã cài đặt công cụ Devart dbForge SQL Complete trong SQL Server Management Studio. Khi tôi thực thi câu lệnh SQL DROP TABLE, nó sẽ nhắc một hộp thoại xác nhận, như được hiển thị bên dưới:
Nhấp vào Vẫn thực hiện . Bảng bị bỏ.
Để xác minh, hãy chạy truy vấn sau:
SELECT * FROM dbo. employee
Nếu nó làm rơi bảng thành công, bạn sẽ nhận được lỗi sau:
Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.
Thả bảng được sử dụng trong Chế độ xem
Ở đây, chúng tôi sẽ cố gắng thả một bảng được sử dụng trong chế độ xem cơ sở dữ liệu. Thực thi tập lệnh sau để tạo chế độ xem có tên vPerson :
CREATE VIEW vPerson
AS
SELECT * FROM Person p
Chạy DROP TABLE lệnh xóa Người bảng:
DROP TABLE [AdventureWorks2017].[dbo].[person]
Khi bảng bị xóa, hãy chạy truy vấn SELECT để điền dữ liệu từ vPerson . Nó sẽ tạo ra một lỗi:
Msg 208, Level 16, State 1, Procedure vPerson, Line 3 [Batch Start Line 0]
Invalid object name 'Person'.
Msg 4413, Level 16, State 1, Line 1
Could not use the view or function 'vPerson' because of binding errors.
Lỗi này xảy ra khi đối tượng mà chế độ xem phụ thuộc vào bị loại bỏ.
Bỏ bảng có khóa ngoại
Nếu bạn đã tạo khóa ngoại trên bảng, bạn không thể bỏ bảng mẹ trước khi bỏ bảng con. Có nghĩa là bạn phải bỏ bảng con hoặc khóa ngoại tham chiếu đến bảng con trước.
Có hai bảng có tên tblstudent và tblSchool - sơ đồ ER như sau:
Lưu ý :Tôi đang sử dụng dbForge Studio dành cho SQL Server 2019 để tạo sơ đồ cơ sở dữ liệu - nó cung cấp thông tin chi tiết thích hợp về cấu trúc bảng với tất cả các phần tử của nó và mối quan hệ thực thể giữa các bảng.
Truy vấn sau tạo các bảng có tên tblstudent và tblSchool và khóa chính và khóa ngoại của chúng:
CREATE TABLE tblSchool
(
SchoolID INT identity(1,1),
SchoolName VARCHAR(500),
City varchar(250),
CONSTRAINT PK_SchoolID PRIMARY KEY (SchoolID)
)
GO
CREATE TABLE tblStudent
(
StudentID INT IDENTITY(1,1) ,
StudentName VARCHAR(250),
StudentGrade CHAR(1),
SchoolID INT,
CONSTRAINT PK_StudentID PRIMARY KEY (StudentID),
Constraint FK_SchoolID FOREIGN KEY (SchoolID) REFERENCES tblSchool (SchoolID)
)
GO
Chạy truy vấn sau để thả tblstudent bảng:
Drop table [tblSchool]
Truy vấn trả về lỗi sau:
Msg 3726, Level 16, State 1, Line 22
Could not drop object 'tblSchool' because it is referenced by a FOREIGN KEY constraint.
Trong bản giới thiệu của chúng tôi, nếu bạn muốn bỏ tblschool bảng, bạn phải thả tblstudent bàn đầu tiên. Hãy xem truy vấn để thả tblStudent và tblschool bảng:
Drop table [tblSchool]
Go
Drop table [tblStudent]
Go
Cũng có thể bỏ bảng batch trong một câu lệnh DROP TABLE. Chạy truy vấn như sau:
Drop table [tblSchool], [tblStudent]
Thả một bảng có các chỉ mục
Chúng ta hãy quan sát một kịch bản khác của hành vi câu lệnh DROP TABLE. Giả sử rằng chúng tôi đã tạo một bảng có tên tblstudent. Nó có một chỉ mục được phân cụm và không được phân cụm.
Khi chúng ta thả một bảng bằng DROP TABLE, nó có xóa các chỉ mục không? Hãy để chúng tôi kiểm tra nó. Tôi đã tạo một bảng có tên tblStudent có một chỉ mục được phân nhóm và một chỉ mục không được phân nhóm. Truy vấn như sau:
CREATE TABLE tblStudent
(
StudentID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
StudentName VARCHAR(250),
StudentGrade CHAR(1),
SchoolID INT
)
GO
CREATE NONCLUSTERED INDEX IDX_tblStudent_StudentName ON tblStudent(StudentName)
GO
Chúng tôi có thể xem danh sách các chỉ mục bằng cách truy vấn sys.indexes DMV.
Khi bảng bị xóa, hãy chạy truy vấn sau:
SELECT Object_name(object_id) AS [Table Name],
NAME AS [Index Name],
type_desc [Index Type]
FROM sys.indexes
WHERE object_id = Object_id('tblStudent')
Đầu ra:
Như bạn có thể thấy, chúng tôi đã tạo cả chỉ mục nhóm và không nhóm cho tblStudent bảng.
Bây giờ, hãy chạy lệnh sau để xóa bảng:
Drop table tblStudent
Một lần nữa, hãy chạy cùng một truy vấn mà chúng tôi đã sử dụng để điền danh sách các chỉ mục:
SELECT Object_name(object_id) AS [Table Name],
NAME AS [Index Name],
type_desc [Index Type]
FROM sys.indexes
WHERE object_id = Object_id('tblStudent')
Đầu ra:
Ảnh chụp màn hình ở trên minh họa rằng truy vấn trả về một tập hợp kết quả trống. Do đó, khi chúng ta thả một bảng, nó cũng giảm các chỉ mục được liên kết với bảng đó.
Bỏ một bảng khỏi Replication
Giả sử bạn muốn bỏ bảng là một phần của quá trình nhân rộng. Trong trường hợp này, bạn phải thực hiện các bước bổ sung.
Tôi đã định cấu hình sao chép giữa hai phiên bản SQL Server 2019 có tên SQL01 và SQL02. Tiếp theo, tôi đã sao chép tblStudent và tblSchool bảng.
Chúng tôi loại bỏ bảng tblSchool khỏi SQL01 bằng cách thực hiện truy vấn sau:
use codingsight
go
drop table tblSchool
Đầu ra:
Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.
Lỗi trên là có thể giải thích được. Để loại bỏ bảng, trước tiên chúng ta phải xóa nó khỏi bản sao:
- Mở SQL Server Management Studio và kết nối với SQL01.
- Mở rộng Nhân rộng -> Mở rộng Xuất bản địa phương .
- Nhấp chuột phải vào Xuất bản và chọn Thuộc tính .
Trong Thuộc tính xuất bản cửa sổ, nhấp vào Bài báo .
Ở đó, bạn có thể xem danh sách các bảng. Bỏ chọn tblSchool bảng và nhấp vào OK .
Lưu ý: Khi bạn loại bỏ bài viết khỏi bản sao, các ảnh chụp nhanh trước đó sẽ trở nên không hợp lệ. Bạn phải tạo một ảnh chụp nhanh mới sau khi bỏ bài viết.
Sau khi xóa bảng khỏi bản sao, hãy thực thi DROP TABLE lệnh trên SQL01 :
use codingsight
go
drop table tblSchool
Đầu ra:
Như bạn có thể thấy, bảng đã bị bỏ.