Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comprendre l'instruction DROP TABLE dans SQL Server

L'instruction SQL Server DROP TABLE sert à supprimer la table de la base de données. Cet article explique certains scénarios d'utilisation et illustre le travail de l'instruction DROP TABLE par des exemples.

Pour la démonstration, nous utilisons les wideworldimportors base de données de démonstration – vous pouvez la télécharger ici.

La syntaxe de l'instruction DROP TABLE est la suivante :

Drop table [Database_name].[Schema_name].[table_name]
  • nom_base_données : le nom de la base de données dont vous souhaitez supprimer la table en SQL.
  • Schema_Name : le nom du schéma pour lequel la table existe. Si vous avez créé la table dans le schéma DBO, nous pouvons ignorer ce paramètre. Si la table est créée dans un schéma autre que celui par défaut, nous devons spécifier le nom du nom du schéma.
  • Table_Name : le nom de la table en SQL ou MySQL que vous souhaitez supprimer.

Lorsque nous supprimons une table, le SQL Server effectue les actions suivantes :

  1. supprime le tableau avec les données.
  2. Supprime les statistiques de la table.
  3. Supprime les index, les contraintes et la clé primaire associés à cette table. Si nous avons les relations de clé étrangère, nous devons supprimer la table enfant.

Avant de déposer la table, nous devons prendre soin des choses suivantes.

  1. Assurez-vous que les procédures stockées, les déclencheurs et les vues qui dépendent de cette table sont altérés ou modifiés. Vous pouvez trouver les objets de base de données nécessaires à l'aide de sp_depends procédure stockée.
  2. Utilisez toujours [database_name].[schema_name].[table_name] format pour supprimer le tableau correct.
  3. N'oubliez pas qu'il est impossible de récupérer la table spécifique à partir de la sauvegarde SQL Server. Si vous souhaitez récupérer une table spécifique, vous devez acheter des outils tiers. Si vous pensez que la table peut nécessiter des références ou des rapports personnalisés, assurez-vous de générer une sauvegarde de la table en créant une autre copie.

Configuration de la démo

Dans la démo Wideworldimportors base de données, il existe des tables nommées tblBusinessEntity , tblCountryRegion, tblCity, et tblCustomer .

  • Les tables tblBusinessEntity et tblCustomer sont dans le schéma par défaut, tandis que tblCountryRegion et tblCity êtes dans le pays schéma.
  • La tblCity est une table temporelle versionnée par le système.
  • La contrainte de clé étrangère est entre tblBusinessEntity et tblCustomer les tables. Le BusinessEntityID colonne de tblCustomer références à BusinessEntityID colonne (clé primaire) de la tblBusinessEntity tableau.

J'ai inséré des données de AdventureWorks2017 base de données à l'aide de l'instruction INSERT INTO SELECT * FROM.

Les scripts T-SQL pour préparer la configuration de démonstration sont les suivants :

Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Créez les tableaux :

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

Créez l'index de clé étrangère :

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

Insérez les données dans les tableaux :

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

Une fois les scripts exécutés, nous pouvons vérifier si les objets ont été créés correctement et si les données ont été insérées dans les tables.

Vérifiez les tableaux :

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

Sortie :

Obtenir le nombre de lignes dans les tableaux :

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

Sortie :

Maintenant, explorons l'utilisation de DROP TABLE par des exemples.

Exemple 1 :Application simple de l'instruction DROP TABLE

Parfois, en travaillant avec une table, une erreur peut se produire. Cela se produit lorsqu'un utilisateur essaie de supprimer une table qui n'existe pas. Il existe un moyen simple d'éviter cela - en utilisant la commande SQL DROP TABLE IF EXISTS.

La syntaxe est la suivante :

-- use database
USE [MyDatabase];
GO

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

Il n'est pas nécessaire de vérifier manuellement si la table que vous souhaitez supprimer existe déjà car la commande DROP TABLE IF EXITS en SQL le fera pour vous.

Vous pouvez utiliser SQL Server Management Studio (SSMS) si vous devez SUPPRIMER toutes les tables.

Supposons que nous voulions supprimer la tblCountryRegion tableau de notre base de données. Pour cela, exécutez la requête suivante :

use WideWorldImporters
Go
drop table tblCountryRegion

Nous recevons l'erreur :

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

Comme mentionné précédemment, pour supprimer la table créée dans le schéma non par défaut, nous devons écrire l'instruction DROP TABLE dans le [schema_name].[table_name] format .

Exécutez la requête suivante :

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

Sortie :

Commands completed successfully.

Nous avons supprimé la table avec succès.

Exemple 2 :supprimez une table contenant une clé étrangère

Laissons tomber tblBusinessEntity depuis la base de données - exécutez la requête suivante :

use WideWorldImporters
Go
Drop table tblBusinessEntity

Il renvoie l'erreur :

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

Lorsque nous supprimons une table avec une clé étrangère qui fait référence à la clé primaire de la table parent, nous devons supprimer la table parent, puis nous pouvons supprimer la table enfant.

Dans notre cas, pour supprimer le tblBusinessEntity table, nous devons supprimer le tblCustomer table. Exécutez la requête suivante :

use WideWorldImporters
Go
Drop table tblcustomer

Ainsi, la table a été supprimée avec succès.

Après avoir supprimé tblcustomer , exécutez l'instruction suivante pour supprimer tblBusinessEntity tableau :

use WideWorldImporters
Go
Drop table tblBusinessEntity

Sortie :

La table a été supprimée avec succès.

Exemple 3 :Supprimer une table temporelle

Les tables temporelles versionnées par le système sont apparues pour la première fois dans SQL Server 2016. Ces tables peuvent récupérer des données supprimées et mises à jour, car la table d'historique suit les modifications qui se sont produites dans la table temporelle. Reportez-vous à Premiers pas avec les tables temporelles versionnées par le système pour plus d'informations sur le concept des tables temporelles.

La suppression de tables temporelles est différente du processus de suppression d'une table habituelle. Nous devons effectuer les étapes suivantes :

  1. Désactivez le SYSTEM_VERSIONING.
  2. Supprimer la table temporelle.
  3. Supprimer la table d'historique.

Examinons le processus :supprimez le [Pays].[Ville] tableau.

Étape 1 :Exécutez le script suivant pour désactiver le SYSTEM_VERSIONING :

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

Étape 2 :Déposez le [Pays].[Ville] table en exécutant l'instruction DROP TABLE suivante :

drop table [Country].[tblCity]

Étape 3 :Déposez le [Pays].[City_Archive] table en exécutant la requête suivante :

drop table [Country].[City_Archive]

Étape 4 :Vérifiez que la table a été supprimée en exécutant la requête suivante :

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

Sortie :

Comme vous pouvez le voir, la table a été supprimée.

Résumé

L'instruction DROP TABLE est nécessaire lorsque nous devons supprimer définitivement certaines tables de la base de données. Cependant, l'utilisation de cette déclaration a ses particularités. Nous avons exploré plusieurs cas d'utilisation standard et les problèmes possibles survenant au cours des tâches.

Nous avons également appris à appliquer l'instruction DROP TABLE pour supprimer une seule table, une table avec une clé étrangère et la table temporelle versionnée par le système. J'espère que cet article vous sera utile.

Lire aussi

Instruction SQL DROP TABLE et divers cas d'utilisation