Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Diferença entre a tabela DELETE e TRUNCATE no SQL Server


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.