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

Instruction SQL DROP TABLE et divers cas d'utilisation

L'instruction SQL DROP TABLE sert à supprimer la table de la base de données. Il supprime la table et ses données et index qui lui sont associés. La déclaration est irréversible. Ainsi, vous ne pouvez restaurer la table qu'en restaurant la sauvegarde.

Cet article couvre les cas suivants :

  1. Supprimer une ou plusieurs tables.
  2. Supprimez le tableau utilisé dans une vue.
  3. Supprimez la table ayant une clé étrangère.
  4. Supprimez la table ayant des index clusterisés et non clusterisés.
  5. Supprimez la table de la configuration de la réplication.

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

IF EXISTS DROP TABLE [DatabaseName].[SchemaName].[TableName]

Remarque :Si vous utilisez SQL Server 2016 et versions ultérieures, vous pouvez spécifier IF EXISTS avant le DROP TABLE déclaration.

En outre, vous spécifiez le nom de la table après l'instruction DROP TABLE. Le format du nom de la table doit être [Nom de la base de données].[Nom du schéma].[Nom de la table].

Un exemple simple de l'instruction DROP TABLE

Pour la démonstration, j'ai restauré le AdventureWorks2017 base de données sur mon poste de travail. Ici, je vais supprimer les employés tableau.

Utilisez la requête suivante utilisée pour supprimer la table :

DROP TABLE [AdventureWorks2017].[dbo].[employees]

J'ai installé les outils Devart dbForge SQL Complete dans SQL Server Management Studio. Lorsque j'exécute une instruction SQL DROP TABLE, une boîte de dialogue de confirmation s'affiche, comme indiqué ci-dessous :

Cliquez sur Exécuter quand même . La table est supprimée.

Pour vérifier, exécutez la requête suivante :

SELECT * FROM dbo. employee

S'il a supprimé la table avec succès, vous recevrez l'erreur suivante :

Msg 208, Level 16, State 1, Line 1
Invalid object name 'dbo.employee'.

Supprimer la table utilisée dans une vue

Ici, nous allons essayer de supprimer une table utilisée dans une vue de base de données. Exécutez le script suivant pour créer une vue nommée vPerson :

CREATE VIEW vPerson 
AS
SELECT * FROM Person p

Exécutez le DROP TABLE commande pour supprimer la personne tableau :

DROP TABLE [AdventureWorks2017].[dbo].[person]

Une fois la table supprimée, exécutez la requête SELECT pour remplir les données de vPerson . Cela produira une erreur :

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.

Cette erreur se produit lorsque l'objet dont dépend la vue est supprimé.

Supprimer la table ayant une clé étrangère

Si vous avez créé une clé étrangère sur une table, vous ne pouvez pas supprimer la table parent avant de supprimer la table enfant. Cela signifie que vous devez d'abord supprimer la table enfant ou la clé étrangère qui fait référence à la table enfant.

Il y a deux tables nommées tblstudent et tblSchool – le diagramme ER est le suivant :

Remarque  :j'utilise dbForge Studio pour SQL Server 2019 pour créer un diagramme de base de données - il donne un aperçu approprié de la structure de la table avec tous ses éléments et la relation d'entité entre les tables.

La requête suivante crée les tables nommées tblstudent et tblSchool et leurs clés primaires et clés étrangères :

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

Exécutez la requête suivante pour supprimer le tblstudent tableau :

Drop table [tblSchool]

La requête renvoie l'erreur suivante :

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

Dans notre démo, si vous voulez supprimer le tblschool table, vous devez supprimer le tblstudent tableau en premier. Jetez un œil à la requête pour supprimer le tblStudent et tblschool tableau :

Drop table [tblSchool]
Go
Drop table [tblStudent]
Go

Il est également possible de supprimer la table batch dans une seule instruction DROP TABLE. Exécutez la requête comme suit :

Drop table [tblSchool], [tblStudent]

Déposer une table avec des index

Observons un autre scénario du comportement de l'instruction DROP TABLE. Supposons que nous ayons créé une table nommée tblstudent. Il a un index clusterisé et un index non clusterisé.

Lorsque nous supprimons une table à l'aide de DROP TABLE, supprime-t-il les index ? Vérifions-le. J'ai créé une table nommée tblStudent qui a un index clusterisé et un index non clusterisé. La requête est la suivante :

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

Nous pouvons voir la liste des index en interrogeant sys.indexes DMV.

Une fois la table supprimée, exécutez la requête suivante :

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')  

Sortie :

Comme vous pouvez le voir, nous avons créé les index clusterisés et non clusterisés pour le tblStudent tableau.

Maintenant, exécutez la commande suivante pour supprimer la table :

Drop table tblStudent

Encore une fois, exécutez la même requête que celle que nous avons utilisée pour remplir la liste des index :

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')  

Sortie :

La capture d'écran ci-dessus montre que la requête a renvoyé un ensemble de résultats vide. Ainsi, lorsque nous supprimons une table, les index associés à cette table sont également supprimés.

Supprimer une table de la réplication

Supposons que vous souhaitiez supprimer la table qui fait partie de la réplication. Dans ce cas, vous devez effectuer des étapes supplémentaires.

J'ai configuré la réplication entre les deux instances de SQL Server 2019 nommées SQL01 et SQL02. Ensuite, j'ai répliqué le tblStudent et tblSchool tableaux.

Nous supprimons la table tblSchool du SQL01 en exécutant la requête suivante :

use codingsight
go
drop table tblSchool

Sortie :

Msg 3724, Level 16, State 3, Line 3
Cannot drop the table 'tblSchool' because it is being used for replication.

L'erreur ci-dessus est explicative. Pour supprimer la table, nous devons d'abord la supprimer de la réplication :

  1. Ouvrez SQL Server Management Studio et connectez-vous à SQL01.
  2. Développer Réplication -> Développer Publication locale .
  3. Cliquez avec le bouton droit sur Publication et sélectionnez Propriétés .

Dans les Propriétés de la publication fenêtre, cliquez sur Articles .

Là, vous pouvez voir la liste des tables. Décochez la case tblSchool tableau et cliquez sur OK .

Remarque : Lorsque vous supprimez l'article de la réplication, les instantanés précédents deviennent invalides. Vous devez générer un nouvel instantané après avoir déposé l'article.

Une fois la table supprimée de la réplication, exécutez la commande DROP TABLE commande sur SQL01 :

use codingsight
go
drop table tblSchool

Sortie :

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