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

Hiểu câu lệnh DROP TABLE trong SQL Server

Câu lệnh SQL Server DROP TABLE dùng để xóa bảng khỏi cơ sở dữ liệu. Bài viết này sẽ giải thích một số trường hợp sử dụng và minh họa hoạt động của câu lệnh DROP TABLE bằng các ví dụ.

Để minh họa, chúng tôi đang sử dụng wideworldimportors cơ sở dữ liệu demo - bạn có thể tải xuống từ đây.

Cú pháp của câu lệnh DROP TABLE như sau:

Drop table [Database_name].[Schema_name].[table_name]
  • Database_name : tên của cơ sở dữ liệu mà bạn muốn xóa bảng trong SQL.
  • Schema_Name : tên của lược đồ mà bảng tồn tại. Nếu bạn đã tạo bảng trong lược đồ DBO, chúng ta có thể bỏ qua tham số này. Nếu bảng được tạo trong một lược đồ không phải mặc định, chúng tôi phải chỉ định tên của tên lược đồ.
  • Tên_bảng : tên của bảng trong SQL hoặc MySQL mà bạn muốn xóa.

Khi chúng tôi thả một bảng, SQL Server thực hiện các hành động sau:

  1. Giảm bớt dữ liệu trong bảng.
  2. Giảm số liệu thống kê của bảng.
  3. Giảm chỉ mục, ràng buộc và khóa chính được liên kết với bảng đó. Nếu chúng ta có các mối quan hệ khóa ngoài, chúng ta phải bỏ bảng con.

Trước khi hạ bàn, chúng ta phải lưu ý những điều sau.

  1. Đảm bảo rằng các thủ tục, trình kích hoạt và dạng xem được lưu trữ phụ thuộc vào bảng đó được thay đổi hoặc sửa đổi. Bạn có thể tìm thấy các đối tượng cơ sở dữ liệu cần thiết bằng cách sử dụng sp_depends thủ tục được lưu trữ.
  2. Luôn sử dụng [database_name]. [schema_name]. [table_name] định dạng để thả đúng bảng.
  3. Hãy nhớ rằng không thể khôi phục bảng cụ thể từ bản sao lưu SQL Server. Nếu bạn muốn khôi phục một bảng cụ thể, bạn phải mua các công cụ của bên thứ ba. Nếu bạn cho rằng bảng có thể yêu cầu tham chiếu hoặc báo cáo tùy chỉnh, hãy đảm bảo bạn tạo bản sao lưu của bảng bằng cách tạo một bản sao khác.

Thiết lập Demo

Trong bản trình diễn Wideworldimportors cơ sở dữ liệu, có các bảng có tên tblBusinessEntity , tblCountryRegion, tblCity, tblCustomer .

  • Các bảng tblBusinessEntity tblCustomer nằm trong giản đồ mặc định, trong khi tblCountryRegion tblCity Quốc gia giản đồ.
  • tblCity là một bảng thời gian được phiên bản hệ thống.
  • Ràng buộc khóa ngoài nằm giữa tblBusinessEntity tblCustomer những cái bàn. BusinessEntityID cột tblCustomer tham chiếu đến BusinessEntityID cột (Khóa chính) của tblBusinessEntity bảng.

Tôi đã chèn dữ liệu từ AdventureWorks2017 cơ sở dữ liệu với sự trợ giúp của câu lệnh INSERT INTO SELECT * FROM.

Các tập lệnh T-SQL để chuẩn bị thiết lập demo như sau:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Tạo bảng:

Use WideworldImportors
go
CREATE TABLE [tblBusinessEntity](
	[BusinessEntityID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_BusinessEntity_BusinessEntityID] PRIMARY KEY CLUSTERED 
([BusinessEntityID] ASC))
GO

CREATE TABLE [Country].[tblCountryRegion](
	[CountryRegionCode] [nvarchar](3) NOT NULL,
	[Name] varchar(500) NOT NULL
 CONSTRAINT [Country].[PK_CountryRegion_CountryRegionCode] PRIMARY KEY CLUSTERED 
([CountryRegionCode] ASC))
GO
CREATE TABLE [tblCustomer](
	[BusinessEntityID] [int] NOT NULL,
	[PersonType] [nchar](2) NOT NULL,
	[NameStyle] varchar(15) NOT NULL,
	[Title] [nvarchar](8) NULL,
	[FirstName] varchar(150) NOT NULL,
	[MiddleName] varchar(150) NULL,
	[LastName] varchar(150) NOT NULL,
	[Suffix] [nvarchar](10) NULL,
	[EmailPromotion] [int] NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY CLUSTERED 
([BusinessEntityID] ASC))
GO
CREATE TABLE [Country].[tblCity](
	[CityID] [int] NOT NULL,
	[CityName] [nvarchar](50) NOT NULL,
	[StateProvinceID] [int] NOT NULL,
	[LatestRecordedPopulation] [bigint] NULL,
	[LastEditedBy] [int] NOT NULL,
	[ValidFrom] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
	[ValidTo] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
 CONSTRAINT [PK_Country_Cities] PRIMARY KEY CLUSTERED 
(
	[CityID] ASC
),
	PERIOD FOR SYSTEM_TIME ([ValidFrom], [ValidTo])
) ON [USERDATA] TEXTIMAGE_ON [USERDATA]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [Country].[City_Archive] )
)
GO

Tạo chỉ mục khóa ngoại:

Use WideworldImportors
go
ALTER TABLE [tblCustomer]  WITH CHECK ADD  CONSTRAINT [FK_Person_BusinessEntity_BusinessEntityID] FOREIGN KEY([BusinessEntityID])
REFERENCES [tblBusinessEntity] ([BusinessEntityID])
GO

Chèn dữ liệu vào các bảng:

Use WideworldImportors
Go
set identity_insert tblBusinessEntity on
Go
insert into tblBusinessEntity ([BusinessEntityID],[ModifiedDate])
select [BusinessEntityID],[ModifiedDate] from [AdventureWorks2017].[Person].[BusinessEntity]
Go
set identity_insert tblBusinessEntity off
Go
insert into tblCustomer ([BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate])
select [BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate] 
from AdventureWorks2017.Person.Person
Go
insert into [Country].[tblCountryRegion]([CountryRegionCode],[Name]) 
select  [CountryRegionCode],[Name] from [AdventureWorks2017].[Person].[CountryRegion]
Go

Sau khi các tập lệnh được thực thi, chúng tôi có thể xác minh xem các đối tượng đã được tạo đúng cách hay chưa và dữ liệu đã được chèn vào các bảng hay chưa.

Kiểm tra các bảng:

Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCustomer','tblCountryRegion','tblBusinessEntity')
Go

Đầu ra:

Nhận số lượng hàng trong bảng:

Use WideWorldImporters
Go
select object_name(object_id) as [Table Name], rows [Total Rows] from sys.partitions 
where object_id in (object_id('tblCustomer'),object_id('country.tblCountryRegion'),object_id('tblBusinessEntity'))
Go

Đầu ra:

Bây giờ, hãy cùng chúng tôi khám phá cách sử dụng DROP TABLE bằng các ví dụ.

Ví dụ 1:Ứng dụng đơn giản của câu lệnh DROP TABLE

Đôi khi trong khi làm việc với bảng, một sai lầm có thể xảy ra. Điều này xảy ra khi người dùng cố gắng XÓA một Bảng không tồn tại. Có một cách đơn giản để tránh điều này - sử dụng lệnh SQL DROP TABLE IF EXISTS.

Cú pháp như sau:

-- use database
USE [MyDatabase];
GO

-- attempt to run DROP TABLE only if it exists 
DROP TABLE IF EXISTS [dbo].[MyTable0];
GO

Không cần phải kiểm tra theo cách thủ công xem bảng bạn muốn thả đã tồn tại hay chưa vì lệnh DROP TABLE IF EXITS trong SQL sẽ thực hiện việc đó cho bạn.

Bạn có thể sử dụng SQL Server Management Studio (SSMS) nếu bạn cần DROP tất cả các bảng.

Giả sử chúng ta muốn bỏ tblCountryRegion bảng từ cơ sở dữ liệu của chúng tôi. Đối với điều đó, hãy chạy truy vấn sau:

use WideWorldImporters
Go
drop table tblCountryRegion

Chúng tôi nhận được lỗi:

Msg 3701, Level 11, State 5, Line 3
Cannot drop the table 'tblCountryRegion' because it does not exist 
or you do not have permission.

Như đã đề cập trước đó , để bỏ bảng được tạo trong lược đồ không phải mặc định, chúng ta phải viết câu lệnh DROP TABLE trong [schema_name]. [Table_name] định dạng .

Chạy truy vấn sau:

use WideWorldImporters
Go
drop table [country].[tblCountryRegion]

Đầu ra:

Các lệnh
Commands completed successfully.

Chúng tôi đã bỏ bảng thành công.

Ví dụ 2:Bỏ một bảng có khóa ngoại

Hãy để chúng tôi thả tblBusinessEntity từ cơ sở dữ liệu - chạy truy vấn sau:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Nó trả về lỗi:

Msg 3726, Level 16, State 1, Line 3
Could not drop object 'tblBusinessEntity' because it is referenced 
by a FOREIGN KEY constraint.

Khi chúng tôi thả một bảng có khóa ngoại tham chiếu đến khóa chính của bảng mẹ, chúng tôi phải xóa bảng mẹ và sau đó chúng tôi có thể bỏ bảng con.

Trong trường hợp của chúng tôi, để bỏ tblBusinessEntity , chúng ta phải bỏ tblCustomer bàn. Chạy truy vấn sau:

use WideWorldImporters
Go
Drop table tblcustomer

Như vậy, bảng đã được loại bỏ thành công.

Sau khi bỏ tblcustomer , hãy chạy câu lệnh sau để bỏ tblBusinessEntity bảng:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Đầu ra:

Bảng đã được xóa thành công.

Ví dụ 3:Bỏ bảng tạm thời

Các bảng tạm thời được phiên bản hệ thống lần đầu tiên xuất hiện trong SQL Server 2016. Các bảng này có thể truy xuất dữ liệu đã xóa và cập nhật, vì bảng lịch sử theo dõi các thay đổi xảy ra trong bảng tạm thời. Tham khảo Bắt đầu với Bảng tạm thời do hệ thống tạo phiên bản để biết thêm thông tin về khái niệm bảng tạm thời.

Quá trình thả bảng tạm thời khác với quy trình thả bảng thông thường. Chúng tôi phải thực hiện các bước sau:

  1. Tắt SYSTEM_VERSIONING.
  2. Bỏ qua bảng thời gian.
  3. Bỏ qua bảng lịch sử.

Hãy kiểm tra quy trình - thả [Quốc gia]. [Thành phố] bảng.

Bước 1:Chạy tập lệnh sau để tắt SYSTEM_VERSIONING:

Alter table [Country].[tblCity] set ( SYSTEM_VERSIONING = OFF  )

Bước 2:Thả [Quốc gia]. [Thành phố] bảng bằng cách chạy câu lệnh DROP TABLE sau:

drop table [Country].[tblCity]

Bước 3:Thả [Quốc gia]. [City_Archive] bảng bằng cách chạy truy vấn sau:

drop table [Country].[City_Archive]

Bước 4:Xác minh rằng bảng đã bị loại bỏ bằng cách thực hiện truy vấn sau:

Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCity')

Đầu ra:

Như bạn có thể thấy, bảng đã bị xóa.

Tóm tắt

Câu lệnh DROP TABLE là cần thiết khi chúng ta cần xóa một số bảng nhất định khỏi cơ sở dữ liệu. Tuy nhiên, cách sử dụng câu lệnh này có những đặc thù của nó. Chúng tôi đã khám phá một số trường hợp sử dụng tiêu chuẩn và các sự cố có thể xảy ra trong quá trình thực hiện nhiệm vụ.

Chúng tôi cũng đã học cách áp dụng câu lệnh DROP TABLE để loại bỏ một bảng, một bảng có khóa ngoại và bảng tạm thời được phiên bản hệ thống. Mong rằng bài viết này hữu ích.

Cũng đọc

Câu lệnh SQL DROP TABLE và các trường hợp sử dụng khác nhau


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zero SQL bế tắc theo thiết kế - bất kỳ mẫu mã nào?

  2. Tại sao điều chỉnh hiệu suất SQL là kỹ năng quản lý cơ sở dữ liệu quan trọng nhất cần có

  3. Khóa ngoài cho khóa không phải khóa chính

  4. Làm cách nào để chuyển một danh sách dưới dạng tham số trong một thủ tục được lưu trữ?

  5. 2 cách lấy thông tin phân vùng cho bảng trong SQL Server (T-SQL)