sql >> Base de Datos >  >> RDS >> Sqlserver

Comprender la instrucción DROP TABLE en SQL Server

La instrucción DROP TABLE de SQL Server sirve para eliminar la tabla de la base de datos. Este artículo explicará algunos escenarios de uso e ilustrará el trabajo de la instrucción DROP TABLE con ejemplos.

Para la demostración, estamos usando importadores de todo el mundo base de datos de demostración:puede descargarla desde aquí.

La sintaxis de la sentencia DROP TABLE es la siguiente:

Drop table [Database_name].[Schema_name].[table_name]
  • Nombre_de_la_base_de_datos : el nombre de la base de datos de la que desea eliminar la tabla en SQL.
  • Nombre_esquema : el nombre del esquema para el que existe la tabla. Si ha creado la tabla en el esquema DBO, podemos omitir este parámetro. Si la tabla se crea en un esquema no predeterminado, debemos especificar el nombre del esquema.
  • Nombre_tabla : el nombre de la tabla en SQL o MySQL que desea eliminar.

Cuando soltamos una tabla, el servidor SQL realiza las siguientes acciones:

  1. Suelta la tabla con datos.
  2. Descarga las estadísticas de la tabla.
  3. Elimina los índices, las restricciones y la clave principal asociados con esa tabla. Si tenemos las relaciones de clave externa, debemos descartar la tabla secundaria.

Antes de dejar caer la mesa, debemos ocuparnos de las siguientes cosas.

  1. Asegúrese de que los procedimientos almacenados, los disparadores y las vistas que dependen de esa tabla se alteren o modifiquen. Puede encontrar los objetos de base de datos necesarios utilizando sp_depends procedimiento almacenado.
  2. Utilice siempre [database_name].[schema_name].[table_name] formato para soltar la tabla correcta.
  3. Recuerde que es imposible recuperar la tabla específica de la copia de seguridad de SQL Server. Si desea recuperar una tabla específica, debe comprar herramientas de terceros. Si cree que la tabla podría requerir referencias o informes personalizados, asegúrese de generar una copia de seguridad de la tabla creando otra copia.

Configuración de demostración

En la demostración Wideworldimportors base de datos, hay tablas llamadas tblBusinessEntity , tblPaísRegión, tblCiudad, y tblCliente .

  • Las tablas tblBusinessEntity y tblCliente están en el esquema predeterminado, mientras que tblCountryRegion y tblCity están en el país esquema.
  • La tblCity es una tabla temporal versionada por el sistema.
  • La restricción de clave externa está entre tblBusinessEntity y tblCliente mesas. El ID de entidad comercial columna de tblCustomer referencias a BusinessEntityID columna (clave principal) de la tblBusinessEntity mesa.

He insertado datos de AdventureWorks2017 base de datos con la ayuda de la instrucción INSERT INTO SELECT * FROM.

Los scripts T-SQL para preparar la configuración de demostración son los siguientes:

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Crea las tablas:

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

Cree el índice de clave externa:

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

Inserte los datos en las tablas:

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

Una vez que se ejecutan los scripts, podemos verificar si los objetos se han creado correctamente y si se han insertado datos en las tablas.

Consulta las tablas:

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

Salida:

Obtener el número de filas en las tablas:

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

Salida:

Ahora, exploremos el uso de DROP TABLE con ejemplos.

Ejemplo 1:Aplicación simple de la instrucción DROP TABLE

A veces, al trabajar con una tabla, puede ocurrir un error. Ocurre cuando un usuario intenta DROP una tabla que no existe. Hay una manera simple de evitar esto:usar el comando SQL DROP TABLE IF EXISTS.

La sintaxis es la siguiente:

-- use database
USE [MyDatabase];
GO

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

No es necesario verificar manualmente si la tabla que desea eliminar ya existe porque el comando DROP TABLE IF EXITS en SQL lo hará por usted.

Puede usar SQL Server Management Studio (SSMS) si necesita DROP todas las tablas.

Supongamos que queremos descartar tblCountryRegion tabla de nuestra base de datos. Para eso, ejecute la siguiente consulta:

use WideWorldImporters
Go
drop table tblCountryRegion

Recibimos el error:

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

Como se mencionó anteriormente, para descartar la tabla creada en el esquema no predeterminado, debemos escribir la instrucción DROP TABLE en el [schema_name].[table_name] formato .

Ejecute la siguiente consulta:

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

Salida:

Commands completed successfully.

Hemos soltado la mesa con éxito.

Ejemplo 2:descartar una tabla que tiene una clave externa

Eliminemos tblBusinessEntity desde la base de datos:ejecute la siguiente consulta:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Devuelve el error:

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

Cuando descartamos una tabla con una clave externa que hace referencia a la clave principal de la tabla principal, debemos descartar la tabla principal y luego podemos descartar la tabla secundaria.

En nuestro caso, para descartar tblBusinessEntity tabla, debemos eliminar el tblCustomer mesa. Ejecute la siguiente consulta:

use WideWorldImporters
Go
Drop table tblcustomer

Por lo tanto, la tabla se ha descartado con éxito.

Después de eliminar tblcustomer , ejecute la siguiente instrucción para descartar tblBusinessEntity tabla:

use WideWorldImporters
Go
Drop table tblBusinessEntity

Salida:

La tabla se ha soltado con éxito.

Ejemplo 3:soltar una tabla temporal

Las tablas temporales versionadas por el sistema aparecieron por primera vez en SQL Server 2016. Estas tablas pueden recuperar datos eliminados y actualizados, ya que la tabla de historial rastrea los cambios que ocurrieron en la tabla temporal. Consulte Introducción a las tablas temporales con versiones del sistema para obtener más información sobre el concepto de tablas temporales.

La eliminación de tablas temporales es diferente del proceso de eliminación de una tabla habitual. Debemos realizar los siguientes pasos:

  1. Apague SYSTEM_VERSIONING.
  2. Suelta la tabla temporal.
  3. Suelte la tabla de historial.

Examinemos el proceso:suelte [País].[Ciudad] mesa.

Paso 1:Ejecute el siguiente script para desactivar SYSTEM_VERSIONING:

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

Paso 2:Suelta el [País].[Ciudad] tabla ejecutando la siguiente sentencia DROP TABLE:

drop table [Country].[tblCity]

Paso 3:suelta el [País].[Ciudad_Archivo] tabla ejecutando la siguiente consulta:

drop table [Country].[City_Archive]

Paso 4:Verifique que la tabla se haya descartado ejecutando la siguiente consulta:

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

Salida:

Como puede ver, la tabla se ha eliminado.

Resumen

La declaración DROP TABLE es necesaria cuando necesitamos eliminar ciertas tablas de la base de datos para siempre. Sin embargo, el uso de esta declaración tiene sus peculiaridades. Hemos explorado varios casos de uso estándar y posibles problemas que ocurren durante las tareas.

También aprendimos cómo aplicar la declaración DROP TABLE para descartar una sola tabla, una tabla con una clave externa y la tabla temporal versionada por el sistema. Espero que este artículo sea útil.

Leer también

Declaración SQL DROP TABLE y varios casos de uso