Sono stati scritti molti articoli per descrivere la differenza tra le istruzioni SQL DELETE e SQL TRUNCATE. Inoltre, è una delle domande più frequenti durante i colloqui di lavoro. Entrambe le istruzioni rimuovono i dati dalla tabella. Tuttavia, ci sono anche differenze.
Questo articolo si concentrerà su queste differenze e le illustrerà con esempi pratici.
Il riepilogo delle differenze Elimina vs Tronca
istruzione Tronca tabella | Dichiarazione DELETE |
Cancella tutti i record dalla tabella. Non possiamo applicare la clausola WHERE per rimuovere record specifici. | Rimuove tutti i record e può applicare la clausola WHERE per eliminare record specifici. |
Non attiva il DELETE trigger. | Esegue DELETE trigger. |
Reimposta il valore dell'identità. | Non reimposta il valore di identità. |
È più veloce grazie all'utilizzo minimo del registro delle transazioni. | È più lento a causa dell'esecuzione di una scansione iniziale della tabella per contare il numero di righe da eliminare e rimuovere le righe una per una. Le modifiche vengono registrate nei registri delle transazioni. |
Utilizza il blocco a livello di riga. | Utilizza il blocco a livello di tabella. |
Non può essere utilizzato con viste indicizzate. | Può essere utilizzato con viste indicizzate. |
Richiede ALTER TABLE permesso. | Richiede ELIMINA permesso sul tavolo. |
A scopo dimostrativo, ho creato una tabella denominata studentDB . Lì ho creato due tavoli, tblSchool e tblStudent e ha inserito alcuni record in entrambe le tabelle.
Lo script seguente crea il tblStudent tabella:
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
Questo script crea la tblSchool tabella:
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
Lo script seguente inserisce i dati in tblStudent tabella:
/*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
Lo script seguente inserisce i dati nella tblSchool tabella:
insert into [dbo].[tblSchool] ([school_name], [city])
values
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')
Ora, identifichiamo le differenze tra le affermazioni.
Differenza 1:Eliminazione dei dati
Il comando DELETE funziona per rimuovere record specifici/tutti dalla tabella. L'istruzione TRUNCATE elimina tutti i dati.
Esploreremo questo scenario.
Elimina dichiarazione
Per rimuovere record specifici con DELETE, possiamo utilizzare la clausola WHERE nella query. Supponiamo di voler eliminare alcuni studenti da tblstudent tabella, il codice dello studente è ST002 .
Aggiungi il filtro nell'istruzione DELETE come segue:
Delete from tblstudent where student_code='ST002'
Questa query eliminerà un solo record dalla tabella.
Una volta eliminato il record, esegui la selezione query per visualizzare i dati:
Select * from tblstudent
Dichiarazione TRUNCATE TABLE
Nella tabella tronca, è impossibile aggiungere la clausola WHERE.
La query seguente rimuove tutti i record da tblStudent tabella:
Truncate table tblStudent
Differenza 2:Trigger
Quando eseguiamo il comando DELETE, SQL Server richiama i trigger DELETE.
Ho creato un trigger chiamato trgdeleteStudent su tblStudent . Quando eseguiamo un'istruzione DELETE su tblstudent tabella, il trigger inserisce un record in un tblDeletedStudent tabella.
Il codice T-SQL per creare tbleletedStudent è il seguente:
CREATE TABLE [dbo].[tblDelatedStudents]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Student_Code] [varchar](10) NULL,
CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)
Il codice T-SQL seguente crea il trigger:
create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE
AS
INSERT INTO [dbo].[tblDelatedStudents](student_code)
SELECT student_code
FROM DELETED;
GO
Esegui la query seguente per eliminare il record dello studente ST0001 :
delete from tblstudent where student_code='ST001'
Esegui la seguente query per verificare:
select * from [dbo].[tblDelatedStudents]
Come puoi vedere nello screenshot sopra, un record è stato aggiunto alla tabella.
Ora eseguiamo l'istruzione TRUNCATE TABLE per rimuovere i dati da tblstudent tabella:
Truncate table [dbo].[tblDelatedStudents]
Verifica i dati interrogando tblDeletedStudent :
select * from [dbo].[tblDelatedStudents]
Come puoi vedere, i record non sono stati inseriti nella tabella tblDeletedStudent .Così, il trgdeletestudent il grilletto non si è attivato.
Differenza 3:reimpostazione dei valori di identità
Quando eseguiamo il comando DELETE, i valori di identità non verranno ripristinati ai valori iniziali. Per l'esecuzione dell'istruzione della tabella TRUNCATE, il valore di identità verrà reimpostato.
Elimina dichiarazione
Esegui l'istruzione DELETE seguente per eliminare i dati da tblStudent tabella:
delete from tblStudent where student_code='ST004'
Quindi, esegui la seguente query di inserimento per aggiungere record a tblStudent la tabella:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('Ramesh Upadhyay','ST007','B',2)
Go
Esegui la query seguente per visualizzare i dati di tblStudent :
select * from [dbo].[tblStudent]
L'immagine sopra mostra che il valore della colonna dell'identità iniziale viene incrementato di uno.
TRONCA TABELLA
Eseguire l'istruzione TRUNCATE TABLE seguente per eliminare i dati da tblStudent tabella:
Truncate table [dbo].[tblStudents]
Una volta eliminati i dati, inserisci i record nella tabella:
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
Esegui la query SELECT per visualizzare i dati:
select * from [dbo].[tblStudent]
Come puoi vedere nell'immagine sopra, il valore dell'identità è stato reimpostato.
Differenza 4:Permessi
Per rimuovere i dati utilizzando l'istruzione DELETE, è necessario disporre dell'autorizzazione DELETE sulla tabella.
Per rimuovere i dati utilizzando l'istruzione TRUNCATE TABLE, è necessaria l'autorizzazione ALTER TABLE.
Elimina dichiarazione
Ho creato un utente chiamato testuser1 e assegnato l'autorizzazione DELETE al tblStudent tabella.
Eliminiamo il record dello studente con student_code=ST001 :
use StudentDB
go
delete from tblstudent where student_code='ST001'
Esegui la selezione query per visualizzare i dati:
Ha cancellato il record dalla tabella.
TRONCA TABELLA
Ora, esegui TRUNCATE TABLE per eliminare i dati:
use StudentDB
go
truncate table tblstudent
La query restituisce il seguente errore:
Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.
Per correggere questo, dobbiamo assegnare l'autorizzazione ALTER TABLE .
Esegui la query seguente per concedere l'accesso a testuser1 su tblStudent tabella:
grant ALTER on tblstudent to testuser1
Esegui nuovamente l'istruzione tronca tabella:
use StudentDB
go
truncate table tblstudent
Visualizza i dati dalla tabella:
I dati sono stati rimossi dalla tabella.
Riepilogo
Questo articolo ha spiegato le differenze tra l'istruzione SQL DELETE e l'istruzione SQL TRUNCATE TABLE. Abbiamo definito tutte le caratteristiche essenziali e le abbiamo illustrate con esempi.