sql >> Base de Datos >  >> RDS >> Sqlserver

Diferencia entre DELETE y TRUNCATE Table en SQL Server

Se han escrito muchos artículos para describir la diferencia entre las sentencias SQL DELETE y SQL TRUNCATE. Además, es una de las preguntas más comunes durante las entrevistas de trabajo. Ambas declaraciones eliminan los datos de la tabla. Sin embargo, también hay diferencias.

Este artículo se centrará en estas diferencias y las ilustrará con ejemplos prácticos.

El resumen de las diferencias entre eliminar y truncar

Instrucción de tabla truncada Declaración DELETE
Elimina todos los registros de la tabla. No podemos aplicar la cláusula WHERE para eliminar registros específicos. Elimina todos los registros y puede aplicar la cláusula WHERE para eliminar registros específicos.
No dispara DELETE disparador. Ejecuta ELIMINAR disparador.
Restablece el valor de identidad. No restablece el valor de identidad.
Es más rápido debido al uso mínimo del registro de transacciones. Es más lento debido a que se realiza un escaneo inicial de la tabla para contar la cantidad de filas que se deben eliminar y se eliminan las filas una por una. Los cambios se registran en los registros de transacciones.
Utiliza el bloqueo de nivel de fila. Utiliza el bloqueo a nivel de tabla.
No se puede usar con vistas indexadas. Se puede usar con vistas indexadas.
Requiere ALTER TABLE permiso. Requiere ELIMINAR permiso sobre la mesa.

Para fines de demostración, he creado una tabla llamada studentDB . Allí, hice dos tablas, tblSchool y tblEstudiante e insertó algunos registros en ambas tablas.

El siguiente script crea el tblStudent tabla:

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 crea la tblSchool tabla:

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

El siguiente script inserta datos en tblStudent tabla:

/*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

El siguiente script inserta datos en tblSchool tabla:

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

Ahora, identifiquemos las diferencias entre las declaraciones.

Diferencia 1:Eliminar los datos

El comando DELETE funciona para eliminar registros específicos/todos de la tabla. La instrucción TRUNCATE elimina todos los datos.

Exploraremos este escenario.

Declaración DELETE

Para eliminar registros específicos con DELETE, podemos usar la cláusula WHERE en la consulta. Supongamos que queremos eliminar algunos estudiantes del tblstudent tabla, el código del estudiante es ST002 .

Agregue el filtro en la declaración DELETE de la siguiente manera:

Delete from  tblstudent where student_code='ST002'

Esta consulta eliminará solo un registro de la tabla.

Una vez que se elimine el registro, ejecute seleccionar consulta para ver los datos:

Select * from tblstudent

Declaración TRUNCATE TABLE

En la tabla truncada, es imposible agregar la cláusula WHERE.

La siguiente consulta elimina todos los registros de tblStudent tabla:

Truncate table tblStudent

Diferencia 2:Desencadenantes

Cuando ejecutamos el comando DELETE, SQL Server invoca los activadores DELETE.

Creé un disparador llamado trgdeleteStudent en tblStudent . Cuando ejecutamos una instrucción DELETE en el tblstudent tabla, el disparador inserta un registro en un tblDeletedStudent mesa.

El código T-SQL para crear tbldeletedStudent es el siguiente:

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

El siguiente código T-SQL crea el disparador:

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

Ejecute la siguiente consulta para eliminar el registro del estudiante ST0001 :

delete from tblstudent where student_code='ST001'

Ejecute la siguiente consulta para verificar:

select * from [dbo].[tblDelatedStudents]

Como puede ver en la captura de pantalla anterior, se agregó un registro a la tabla.

Ahora, ejecutemos la instrucción TRUNCATE TABLE para eliminar los datos del tblstudent tabla:

Truncate table [dbo].[tblDelatedStudents]

Verifique los datos consultando tblDeletedStudent :

select * from [dbo].[tblDelatedStudents]

Como puede ver, los registros no se han insertado en la tabla tblDeletedStudent .Así, el trgdeletestudent el gatillo no se disparó.

Diferencia 3:restablecer los valores de identidad

Cuando ejecutamos el comando DELETE, los valores de identidad no se restablecerán a los valores iniciales. Para la ejecución de la declaración de la tabla TRUNCATE, el valor de identidad se restablecerá.

Declaración DELETE

Ejecute la siguiente instrucción DELETE para eliminar los datos del tblStudent tabla:

delete from tblStudent where student_code='ST004'

Luego, ejecute la siguiente insertar consulta para agregar registros al tblStudent la mesa:

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

Ejecute la siguiente consulta para ver los datos de tblStudent :

select * from [dbo].[tblStudent]

La imagen de arriba muestra que el valor de la columna de identidad inicial se incrementa en uno.

TABLA TRUNCADA

Ejecute la instrucción TRUNCATE TABLE a continuación para eliminar los datos del tblStudent tabla:

Truncate table [dbo].[tblStudents]

Una vez que se eliminan los datos, inserte registros en la tabla:

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

Ejecute la consulta SELECT para ver los datos:

select * from [dbo].[tblStudent]

Como puede ver en la imagen de arriba, el valor de identidad se ha restablecido.

Diferencia 4:Permisos

Para eliminar datos usando la declaración DELETE, debemos tener el permiso DELETE en la tabla.

Para eliminar los datos usando la sentencia TRUNCATE TABLE, necesitamos el permiso ALTER TABLE.

Declaración DELETE

He creado un usuario llamado testuser1 y asignó el permiso DELETE en tblStudent mesa.

Eliminamos el registro del estudiante con student_code=ST001 :

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

Ejecute seleccionar consulta para ver datos:

Borró el registro de la tabla.

TABLA TRUNCADA

Ahora, ejecute TRUNCATE TABLE para eliminar los datos:

use StudentDB
go
truncate table tblstudent

La consulta devuelve el siguiente error:

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 rectificar esto, debemos asignar el permiso ALTER TABLE .

Ejecute la siguiente consulta para otorgar acceso a testuser1 en el tblStudent tabla:

grant ALTER on tblstudent to testuser1

Vuelva a ejecutar la sentencia de tabla truncada:

use StudentDB
go
truncate table tblstudent

Ver los datos de la tabla:

Los datos se han eliminado de la tabla.

Resumen

Este artículo explica las diferencias entre la instrucción SQL DELETE y la instrucción SQL TRUNCATE TABLE. Hemos definido todas las funciones esenciales y las hemos ilustrado con ejemplos.