Många artiklar har skrivits för att beskriva skillnaden mellan SQL DELETE- och SQL TRUNCATE-satserna. Dessutom är det en av de vanligaste frågorna under anställningsintervjuer. Båda påståendena tar bort data från tabellen. Men det finns också skillnader.
Den här artikeln kommer att fokusera på dessa skillnader och illustrera dem med praktiska exempel.
Sammanfattningen av skillnaderna Ta bort vs Trunkering
Trunkera tabellsats | DELETE-sats |
Tar bort alla poster från tabellen. Vi kan inte tillämpa WHERE-satsen för att ta bort specifika poster. | Tar bort alla poster och kan använda WHERE-satsen för att radera specifika poster. |
Avlöser inte DELETE utlösare. | Kör DELETE utlösare. |
Återställer identitetsvärdet. | Återställer inte identitetsvärdet. |
Är snabbare på grund av minimal användning av transaktionsloggen. | Är långsammare på grund av att man utför en första tabellsökning för att räkna antalet rader som ska raderas och rader tas bort en efter en. Ändringarna loggas i transaktionsloggar. |
Använder radnivålåset. | Använder tabellnivålåset. |
Kan inte användas med indexerade vyer. | Kan användas med indexerade vyer. |
Kräver ALTER TABLE tillstånd. | Kräver DELETE tillåtelse på bordet. |
I demonstrationssyfte har jag skapat en tabell med namnet studentDB . Där har jag gjort två tabeller, tblSchool och tblStudent , och infogade några poster i båda tabellerna.
Följande skript skapar tblStudent tabell:
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
Det här skriptet skapar tblSchool tabell:
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
Följande skript infogar data i tblStudent tabell:
/*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
Skriptet nedan infogar data i tblSchool tabell:
insert into [dbo].[tblSchool] ([school_name], [city])
values
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')
Låt oss nu identifiera skillnaderna mellan påståendena.
Skillnad 1:Ta bort data
Kommandot DELETE fungerar för att ta bort specifika/alla poster från tabellen. TRUNCATE-satsen tar bort all data.
Vi ska utforska det här scenariot.
RADERA uttalande
För att ta bort specifika poster med DELETE kan vi använda WHERE-satsen i frågan. Anta att vi vill ta bort några elever från tblstudent tabell är elevens kod ST002 .
Lägg till filtret i DELETE-satsen enligt följande:
Delete from tblstudent where student_code='ST002'
Den här frågan tar bara bort en post från tabellen.
När posten har raderats kör du select fråga för att se data:
Select * from tblstudent
TRUNCATE TABLE Statement
I trunkeringstabellen är det omöjligt att lägga till WHERE-satsen.
Följande fråga tar bort alla poster från tblStudent tabell:
Truncate table tblStudent
Skillnad 2:Utlösare
När vi kör kommandot DELETE anropar SQL-servern DELETE-triggarna.
Jag har skapat en utlösare som heter trgdeleteStudent på tblStudent . När vi kör en DELETE-sats på tblstudent tabell, infogar utlösaren en post i en tblDeleted Student bord.
T-SQL-koden för att skapa tbldeletedStudent är följande:
CREATE TABLE [dbo].[tblDelatedStudents]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Student_Code] [varchar](10) NULL,
CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)
T-SQL-koden nedan skapar utlösaren:
create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE
AS
INSERT INTO [dbo].[tblDelatedStudents](student_code)
SELECT student_code
FROM DELETED;
GO
Kör frågan nedan för att radera posten för studenten ST0001 :
delete from tblstudent where student_code='ST001'
Kör följande fråga för att verifiera:
select * from [dbo].[tblDelatedStudents]
Som du kan se i skärmdumpen ovan har en post lagts till i tabellen.
Låt oss nu köra TRUNCATE TABLE-satsen för att ta bort data från tblstudent tabell:
Truncate table [dbo].[tblDelatedStudents]
Verifiera data genom att fråga tblDeleted Student :
select * from [dbo].[tblDelatedStudents]
Som du kan se har posterna inte infogats i tabellen tblDeleted Student .Därmed, trgdeletestudent avtryckaren avfyrades inte.
Skillnad 3:Återställa identitetsvärdena
När vi kör kommandot DELETE återställs inte identitetsvärdena till de ursprungliga värdena. För körning av TRUNCATE-tabellsatsen kommer identitetsvärdet att återställas.
RADERA uttalande
Kör DELETE-satsen nedan för att radera data från tblStudent tabell:
delete from tblStudent where student_code='ST004'
Kör sedan följande infoga fråga för att lägga till poster till tblStudent tabellen:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('Ramesh Upadhyay','ST007','B',2)
Go
Kör följande fråga för att se data från tblStudent :
select * from [dbo].[tblStudent]
Bilden ovan visar att det ursprungliga värdet för identitetskolumnen ökas med ett.
TRUNKERA TABELL
Kör TRUNCATE TABLE-satsen nedan för att radera data från tblStudent tabell:
Truncate table [dbo].[tblStudents]
När data har raderats, infoga poster i tabellen:
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
Kör SELECT-frågan för att se data:
select * from [dbo].[tblStudent]
Som du kan se i bilden ovan har identitetsvärdet återställts.
Skillnad 4:Behörigheter
För att ta bort data med DELETE-satsen måste vi ha DELETE-behörigheten på bordet.
För att ta bort data med TRUNCATE TABLE-satsen behöver vi ALTER TABLE-tillståndet.
RADERA uttalande
Jag har skapat en användare som heter testuser1 och tilldelade tblStudenten behörigheten DELETE bord.
Vi raderar posten för studenten med student_code=ST001 :
use StudentDB
go
delete from tblstudent where student_code='ST001'
Kör select fråga för att visa data:
Det raderade posten från tabellen.
TRUNKERA TABELL
Kör nu TRUNCATE TABLE för att radera data:
use StudentDB
go
truncate table tblstudent
Frågan returnerar följande fel:
Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.
För att rätta till detta måste vi tilldela ALTER TABLE-behörigheten .
Kör följande fråga för att ge åtkomst till testuser1 på tblStudent tabell:
grant ALTER on tblstudent to testuser1
Kör trunkeringstabellsatsen igen:
use StudentDB
go
truncate table tblstudent
Visa data från tabellen:
Uppgifterna har tagits bort från tabellen.
Sammanfattning
Den här artikeln förklarade skillnaderna mellan SQL DELETE-satsen och SQL TRUNCATE TABLE-satsen. Vi har definierat alla viktiga funktioner och illustrerat dem med exempel.