Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Unterschied zwischen DELETE- und TRUNCATE-Tabelle in SQL Server

Viele Artikel wurden geschrieben, um den Unterschied zwischen den Anweisungen SQL DELETE und SQL TRUNCATE zu beschreiben. Außerdem ist es eine der häufigsten Fragen in Vorstellungsgesprächen. Beide Anweisungen entfernen die Daten aus der Tabelle. Es gibt jedoch auch Unterschiede.

Dieser Artikel konzentriert sich auf diese Unterschiede und veranschaulicht sie mit praktischen Beispielen.

Die Zusammenfassung der Unterschiede zwischen Löschen und Abschneiden

Truncate Table-Anweisung DELETE-Anweisung
Löscht alle Datensätze aus der Tabelle. Wir können die WHERE-Klausel nicht anwenden, um bestimmte Datensätze zu entfernen. Entfernt alle Datensätze und kann die WHERE-Klausel anwenden, um bestimmte Datensätze zu löschen.
Löst DELETE nicht aus auslösen. Führt das LÖSCHEN aus auslösen.
Setzt den Identitätswert zurück. Setzt den Identitätswert nicht zurück.
Ist schneller aufgrund der minimalen Nutzung des Transaktionsprotokolls. Ist langsamer, da ein anfänglicher Tabellenscan durchgeführt wird, um die Anzahl der zu löschenden Zeilen zu zählen, und Zeilen nacheinander entfernt werden. Die Änderungen werden in Transaktionsprotokollen protokolliert.
Verwendet die Sperre auf Zeilenebene. Verwendet die Sperre auf Tabellenebene.
Kann nicht mit indizierten Ansichten verwendet werden. Kann mit indizierten Ansichten verwendet werden.
Erfordert die ALTER TABLE Erlaubnis. Erfordert das LÖSCHEN Erlaubnis auf dem Tisch.

Zu Demonstrationszwecken habe ich eine Tabelle mit dem Namen studentDB erstellt . Dort habe ich zwei Tabellen erstellt, tblSchool und tblStudent , und fügte einige Datensätze in beide Tabellen ein.

Das folgende Skript erstellt den tblStudent Tabelle:

CREATE TABLE [dbo].[tblStudent](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[student_name] [varchar](250) NOT NULL,
	[student_code] [varchar](5) NOT NULL,
	[student_grade] [char](2) NOT NULL,
	[SchoolID] [int] NOT NULL,
 CONSTRAINT [PK_tblStudent] PRIMARY KEY CLUSTERED 
( [ID] ASC))
GO
ALTER TABLE [dbo].[tblStudent]  WITH CHECK ADD  CONSTRAINT [FK_tblStudent_tblSchool] FOREIGN KEY([SchoolID])
REFERENCES [dbo].[tblSchool] ([School_ID])
GO

ALTER TABLE [dbo].[tblStudent] CHECK CONSTRAINT [FK_tblStudent_tblSchool]
GO

Dieses Skript erstellt die tblSchool Tabelle:

CREATE TABLE [dbo].[tblSchool](
	[School_ID] [int] IDENTITY(1,1) NOT NULL,
	[School_Name] [varchar](500) NULL,
	[City] [varchar](50) NULL,
CONSTRAINT [PK_tblSchool] PRIMARY KEY CLUSTERED 
([School_ID] ASC)) ON [PRIMARY]
GO

Das folgende Skript fügt Daten in tblStudent ein Tabelle:

/*Insert Data in tblStudent*/
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Nisarg Upadhyay','ST001','A',1),
('Nirali Upadhyay','ST002','B',1),
('Dixit Upadhyay','ST003','A',1),
('Bharti Upadhyay','ST004','C',2),
('Nimesh Patel','ST005','C',2),
('Raghav Dave','ST006','A',1)
Go

Das folgende Skript fügt Daten in die tblSchool ein Tabelle:

insert into [dbo].[tblSchool] ([school_name], [city]) 
values 
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')

Lassen Sie uns nun die Unterschiede zwischen den Aussagen identifizieren.

Unterschied 1:Löschen der Daten

Der DELETE-Befehl funktioniert, um bestimmte/alle Datensätze aus der Tabelle zu entfernen. Die TRUNCATE-Anweisung löscht alle Daten.

Wir werden dieses Szenario untersuchen.

DELETE-Anweisung

Um bestimmte Datensätze mit DELETE zu entfernen, können wir die WHERE-Klausel in der Abfrage verwenden. Angenommen, wir möchten einige Schüler aus tblstudent löschen Tabelle lautet der Schülercode ST002 .

Fügen Sie den Filter in der DELETE-Anweisung wie folgt hinzu:

Delete from  tblstudent where student_code='ST002'

Diese Abfrage löscht nur einen Datensatz aus der Tabelle.

Sobald der Datensatz gelöscht ist, führen Sie select aus Abfrage, um die Daten anzuzeigen:

Select * from tblstudent

TRUNCATE TABLE-Anweisung

In der Truncate-Tabelle ist das Hinzufügen der WHERE-Klausel nicht möglich.

Die folgende Abfrage entfernt alle Datensätze aus tblStudent Tabelle:

Truncate table tblStudent

Unterschied 2:Auslöser

Wenn wir den DELETE-Befehl ausführen, ruft der SQL Server die DELETE-Trigger auf.

Ich habe einen Trigger namens trgdeleteStudent erstellt auf tblStudent . Wenn wir eine DELETE-Anweisung auf der tblstudent ausführen Tabelle fügt der Trigger einen Datensatz in einen tblDeletedStudent ein Tabelle.

Der T-SQL-Code zum Erstellen von tbldeletedStudent lautet wie folgt:

CREATE TABLE [dbo].[tblDelatedStudents]
(
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Student_Code] [varchar](10) NULL,
	CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)

Der folgende T-SQL-Code erstellt den Trigger:

create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE 
AS 
INSERT INTO [dbo].[tblDelatedStudents](student_code)
  SELECT student_code
FROM DELETED;
GO

Führen Sie die folgende Abfrage aus, um den Datensatz des Schülers ST0001 zu löschen :

delete from tblstudent where student_code='ST001'

Führen Sie zur Überprüfung die folgende Abfrage aus:

select * from [dbo].[tblDelatedStudents]

Wie Sie im obigen Screenshot sehen können, wurde der Tabelle ein Datensatz hinzugefügt.

Lassen Sie uns nun die TRUNCATE TABLE-Anweisung ausführen, um die Daten aus tblstudent zu entfernen Tabelle:

Truncate table [dbo].[tblDelatedStudents]

Überprüfen Sie die Daten, indem Sie tblDeletedStudent abfragen :

select * from [dbo].[tblDelatedStudents]

Wie Sie sehen können, wurden die Datensätze nicht in die tblDeletedStudent-Tabelle eingefügt .Somit der trgdeletestudent Trigger hat nicht ausgelöst.

Unterschied 3:Zurücksetzen der Identitätswerte

Wenn wir den DELETE-Befehl ausführen, werden die Identitätswerte nicht auf die Anfangswerte zurückgesetzt. Für die Ausführung der TRUNCATE-Tabellenanweisung wird der Identitätswert zurückgesetzt.

DELETE-Anweisung

Führen Sie die folgende DELETE-Anweisung aus, um die Daten aus tblStudent zu löschen Tabelle:

delete from tblStudent where student_code='ST004'

Führen Sie dann die folgende Abfrage einfügen aus um Datensätze zu tblStudent hinzuzufügen die Tabelle:

insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Ramesh Upadhyay','ST007','B',2)
Go

Führen Sie die folgende Abfrage aus, um die Daten von tblStudent anzuzeigen :

select * from [dbo].[tblStudent]

Das obige Bild zeigt, dass der anfängliche Identitätsspaltenwert um eins erhöht wird.

TABELLE KÜRZEN

Führen Sie die folgende TRUNCATE TABLE-Anweisung aus, um die Daten aus tblStudent zu löschen Tabelle:

Truncate table [dbo].[tblStudents]

Sobald die Daten gelöscht sind, fügen Sie Datensätze in die Tabelle ein:

insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Nisarg Upadhyay','ST001','A',1),
('Nirali Upadhyay','ST002','B',1),
('Dixit Upadhyay','ST003','A',1),
('Bharti Upadhyay','ST004','C',2),
('Nimesh Patel','ST005','C',2),
('Raghav Dave','ST006','A',1)
Go

Führen Sie die SELECT-Abfrage aus, um die Daten anzuzeigen:

select * from [dbo].[tblStudent]

Wie Sie im obigen Bild sehen können, wurde der Identitätswert zurückgesetzt.

Unterschied 4:Berechtigungen

Um Daten mit der DELETE-Anweisung zu entfernen, müssen wir die DELETE-Berechtigung für die Tabelle haben.

Um die Daten mit der TRUNCATE TABLE-Anweisung zu entfernen, benötigen wir die ALTER TABLE-Berechtigung.

DELETE-Anweisung

Ich habe einen Benutzer namens testuser1 erstellt und dem tblStudent die DELETE-Berechtigung zugewiesen Tabelle.

Wir löschen den Datensatz des Studenten mit student_code=ST001 :

use StudentDB
go
delete from tblstudent where student_code='ST001'

Führen Sie die Auswahl aus Abfrage zum Anzeigen von Daten:

Der Datensatz wurde aus der Tabelle gelöscht.

TABELLE KÜRZEN

Führen Sie nun TRUNCATE TABLE aus, um die Daten zu löschen:

use StudentDB
go
truncate table tblstudent

Die Abfrage gibt den folgenden Fehler zurück:

Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.

Um dies zu korrigieren, müssen wir die ALTER TABLE-Berechtigung zuweisen .

Führen Sie die folgende Abfrage aus, um testuser1 Zugriff zu gewähren auf dem tblStudent Tabelle:

grant ALTER on tblstudent to testuser1

Führen Sie die Anweisung zum Abschneiden der Tabelle erneut aus:

use StudentDB
go
truncate table tblstudent

Sehen Sie sich die Daten aus der Tabelle an:

Die Daten wurden aus der Tabelle entfernt.

Zusammenfassung

In diesem Artikel wurden die Unterschiede zwischen der SQL-Anweisung DELETE und der SQL-Anweisung TRUNCATE TABLE erläutert. Wir haben alle wesentlichen Funktionen definiert und mit Beispielen illustriert.