Muitos artigos foram escritos para descrever a diferença entre as instruções SQL DELETE e SQL TRUNCATE. Além disso, é uma das perguntas mais comuns durante as entrevistas de emprego. Ambas as instruções removem os dados da tabela. No entanto, também existem diferenças.
Este artigo se concentrará nessas diferenças e as ilustrará com exemplos práticos.
O resumo das diferenças Excluir vs Truncar
Instrução de truncar tabela | excluir declaração |
Exclui todos os registros da tabela. Não podemos aplicar a cláusula WHERE para remover registros específicos. | Remove todos os registros e pode aplicar a cláusula WHERE para excluir registros específicos. |
Não dispara o DELETE acionador. | Executa o DELETE acionador. |
Reinicia o valor de identidade. | Não redefine o valor de identidade. |
É mais rápido devido ao uso mínimo do log de transações. | É mais lento devido à execução de uma verificação inicial da tabela para contar o número de linhas a serem excluídas e removendo as linhas uma a uma. As alterações são registradas nos logs de transações. |
Usa o bloqueio em nível de linha. | Usa o bloqueio em nível de tabela. |
Não pode ser usado com visualizações indexadas. | Pode ser usado com visualizações indexadas. |
Requer o ALTER TABLE permissão. | Requer o EXCLUIR permissão na tabela. |
Para fins de demonstração, criei uma tabela chamada studentDB . Lá, fiz duas tabelas, tblSchool e tblStudent , e inseri alguns registros em ambas as tabelas.
O script a seguir cria o tblStudent tabela:
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
Este script cria a tblSchool tabela:
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
O script a seguir insere dados no tblStudent tabela:
/*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
O script abaixo insere dados na tblSchool tabela:
insert into [dbo].[tblSchool] ([school_name], [city])
values
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')
Agora, vamos identificar as diferenças entre as declarações.
Diferença 1:Excluindo os dados
O comando DELETE funciona para remover registros específicos/todos da tabela. A instrução TRUNCATE exclui todos os dados.
Exploraremos este cenário.
Excluir declaração
Para remover registros específicos com DELETE, podemos usar a cláusula WHERE na consulta. Suponha que queremos excluir alguns alunos do tblstudent tabela, o código do aluno é ST002 .
Adicione o filtro na instrução DELETE da seguinte maneira:
Delete from tblstudent where student_code='ST002'
Essa consulta excluirá apenas um registro da tabela.
Depois que o registro for excluído, execute o selecionar query para visualizar os dados:
Select * from tblstudent
Instrução TRUNCATE TABLE
Na tabela truncar, é impossível adicionar a cláusula WHERE.
A consulta a seguir remove todos os registros do tblStudent tabela:
Truncate table tblStudent
Diferença 2:acionadores
Quando executamos o comando DELETE, o SQL Server invoca os gatilhos DELETE.
Eu criei um gatilho chamado trgdeleteStudent em tblStudent . Quando executamos uma instrução DELETE no tblstudent tabela, o gatilho insere um registro em um tblDeletedStudent tabela.
O código T-SQL para criar tbldeletedStudent é o seguinte:
CREATE TABLE [dbo].[tblDelatedStudents]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Student_Code] [varchar](10) NULL,
CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)
O código T-SQL abaixo cria o gatilho:
create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE
AS
INSERT INTO [dbo].[tblDelatedStudents](student_code)
SELECT student_code
FROM DELETED;
GO
Execute a consulta abaixo para excluir o registro do aluno ST0001 :
delete from tblstudent where student_code='ST001'
Execute a seguinte consulta para verificar:
select * from [dbo].[tblDelatedStudents]
Como você pode ver na captura de tela acima, um registro foi adicionado à tabela.
Agora, vamos executar a instrução TRUNCATE TABLE para remover os dados do tblstudent tabela:
Truncate table [dbo].[tblDelatedStudents]
Verifique os dados consultando tblDeletedStudent :
select * from [dbo].[tblDelatedStudents]
Como você pode ver, os registros não foram inseridos na tabela tblDeletedStudent .Assim, o trgdeletestudent gatilho não disparou.
Diferença 3:redefinindo os valores de identidade
Quando executamos o comando DELETE, os valores de identidade não serão redefinidos para os valores iniciais. Para a execução da instrução de tabela TRUNCATE, o valor de identidade será redefinido.
Excluir declaração
Execute a instrução DELETE abaixo para excluir os dados do tblStudent tabela:
delete from tblStudent where student_code='ST004'
Em seguida, execute a seguinte inserir consulta para adicionar registros ao tblStudent a mesa:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('Ramesh Upadhyay','ST007','B',2)
Go
Execute a seguinte consulta para visualizar os dados de tblStudent :
select * from [dbo].[tblStudent]
A imagem acima mostra que o valor da coluna de identidade inicial é incrementado em um.
TRUNCAR TABELA
Execute a instrução TRUNCATE TABLE abaixo para excluir os dados do tblStudent tabela:
Truncate table [dbo].[tblStudents]
Depois que os dados forem excluídos, insira os registros na tabela:
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
Execute a consulta SELECT para visualizar os dados:
select * from [dbo].[tblStudent]
Como você pode ver na imagem acima, o valor de identidade foi redefinido.
Diferença 4:permissões
Para remover dados usando a instrução DELETE, devemos ter a permissão DELETE na tabela.
Para remover os dados usando a instrução TRUNCATE TABLE, exigimos a permissão ALTER TABLE.
Excluir declaração
Criei um usuário chamado testuser1 e atribuiu a permissão DELETE no tblStudent tabela.
Excluímos o registro do aluno com student_code=ST001 :
use StudentDB
go
delete from tblstudent where student_code='ST001'
Execute o selecionar consulta para visualizar dados:
Ele excluiu o registro da tabela.
TRUNCAR TABELA
Agora, execute o TRUNCATE TABLE para excluir os dados:
use StudentDB
go
truncate table tblstudent
A consulta retorna o seguinte erro:
Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.
Para corrigir isso, devemos atribuir a permissão ALTER TABLE .
Execute a seguinte consulta para conceder acesso a testuser1 no tblStudent tabela:
grant ALTER on tblstudent to testuser1
Execute novamente a instrução truncate table:
use StudentDB
go
truncate table tblstudent
Veja os dados da tabela:
Os dados foram removidos da tabela.
Resumo
Este artigo explicou as diferenças entre a instrução SQL DELETE e a instrução SQL TRUNCATE TABLE. Definimos todos os recursos essenciais e os ilustramos com exemplos.