Bylo napsáno mnoho článků popisujících rozdíl mezi příkazy SQL DELETE a SQL TRUNCATE. Navíc je to jedna z nejčastějších otázek při přijímacích pohovorech. Oba příkazy odeberou data z tabulky. Existují však také rozdíly.
Tento článek se zaměří na tyto rozdíly a ilustruje je na praktických příkladech.
Shrnutí rozdílů Smazat vs. Zkrátit
Příkaz Zkrátit tabulku | DELETE příkaz |
Odstraní všechny záznamy z tabulky. Nemůžeme použít klauzuli WHERE k odstranění konkrétních záznamů. | Odstraní všechny záznamy a může použít klauzuli WHERE k odstranění konkrétních záznamů. |
Nespustí DELETE spoušť. | Provede příkaz DELETE spoušť. |
Resetuje hodnotu identity. | Neresetuje hodnotu identity. |
Je rychlejší díky minimálnímu využití transakčního protokolu. | Je pomalejší kvůli provádění počátečního skenování tabulky, aby se spočítal počet řádků k odstranění, a odstranění řádků jeden po druhém. Změny se zaznamenávají do protokolů transakcí. |
Používá zámek na úrovni řádku. | Používá zámek na úrovni tabulky. |
Nelze použít s indexovanými pohledy. | Lze použít s indexovanými pohledy. |
Vyžaduje ALTER TABLE povolení. | Vyžaduje DELETE povolení na stůl. |
Pro demonstrační účely jsem vytvořil tabulku s názvem studentDB . Tam jsem vytvořil dvě tabulky, tblSchool a tblStudent a vložili do obou tabulek nějaké záznamy.
Následující skript vytvoří tblStudent tabulka:
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
Tento skript vytvoří tblSchool tabulka:
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
Následující skript vloží data do tblStudent tabulka:
/*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
Níže uvedený skript vloží data do tblSchool tabulka:
insert into [dbo].[tblSchool] ([school_name], [city])
values
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')
Nyní pojďme identifikovat rozdíly mezi tvrzeními.
Rozdíl 1:Smazání dat
Příkaz DELETE slouží k odstranění konkrétních/všech záznamů z tabulky. Příkaz TRUNCATE odstraní všechna data.
Tento scénář prozkoumáme.
DELETE Statement
Pro odstranění konkrétních záznamů pomocí DELETE můžeme v dotazu použít klauzuli WHERE. Předpokládejme, že chceme odstranit některé studenty z tblstudent tabulky, kód studenta je ST002 .
Přidejte filtr do příkazu DELETE takto:
Delete from tblstudent where student_code='ST002'
Tento dotaz odstraní z tabulky pouze jeden záznam.
Po odstranění záznamu spusťte vybrat dotaz pro zobrazení dat:
Select * from tblstudent
Příkaz TRUNCATE TABLE
V tabulce zkrácení není možné přidat klauzuli WHERE.
Následující dotaz odebere všechny záznamy z tblStudent tabulka:
Truncate table tblStudent
Rozdíl 2:Spouštěče
Když spustíme příkaz DELETE, SQL Server vyvolá spouštěče DELETE.
Vytvořil jsem spouštěč s názvem trgdeleteStudent na tblStudent . Když na tblstudent provedeme příkaz DELETE tabulka, spouštěč vloží záznam do tblDeletedStudent tabulka.
Kód T-SQL pro vytvoření tbldeletedStudent je následující:
CREATE TABLE [dbo].[tblDelatedStudents]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Student_Code] [varchar](10) NULL,
CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)
Níže uvedený kód T-SQL vytváří spouštěč:
create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE
AS
INSERT INTO [dbo].[tblDelatedStudents](student_code)
SELECT student_code
FROM DELETED;
GO
Spusťte níže uvedený dotaz a smažte záznam studenta ST0001 :
delete from tblstudent where student_code='ST001'
Pro ověření spusťte následující dotaz:
select * from [dbo].[tblDelatedStudents]
Jak můžete vidět na výše uvedeném snímku obrazovky, do tabulky byl přidán záznam.
Nyní spusťte příkaz TRUNCATE TABLE k odstranění dat z tblstudent tabulka:
Truncate table [dbo].[tblDelatedStudents]
Ověřte data dotazem tblDeletedStudent :
select * from [dbo].[tblDelatedStudents]
Jak můžete vidět, záznamy nebyly vloženy do tabulky tblDeletedStudent .Tedy trgdeletestudent spoušť se nespustila.
Rozdíl 3:Resetování hodnot identity
Když provedeme příkaz DELETE, hodnoty identity se neresetují na výchozí hodnoty. Při provádění příkazu tabulky TRUNCATE se hodnota identity resetuje.
DELETE Statement
Spuštěním níže uvedeného příkazu DELETE smažte data z tblStudent tabulka:
delete from tblStudent where student_code='ST004'
Poté proveďte následující vložit dotaz přidat záznamy do tblStudent tabulka:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('Ramesh Upadhyay','ST007','B',2)
Go
Spuštěním následujícího dotazu zobrazíte data tblStudent :
select * from [dbo].[tblStudent]
Výše uvedený obrázek ukazuje, že počáteční hodnota sloupce identity je zvýšena o jedna.
ZKRÁTIT TABULKU
Spuštěním níže uvedeného příkazu TRUNCATE TABLE smažte data z tblStudent tabulka:
Truncate table [dbo].[tblStudents]
Po odstranění dat vložte záznamy do tabulky:
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
Spusťte dotaz SELECT a zobrazte data:
select * from [dbo].[tblStudent]
Jak můžete vidět na obrázku výše, hodnota identity byla resetována.
Rozdíl 4:Oprávnění
Chcete-li odstranit data pomocí příkazu DELETE, musíme mít v tabulce oprávnění DELETE.
K odstranění dat pomocí příkazu TRUNCATE TABLE potřebujeme oprávnění ALTER TABLE.
DELETE Statement
Vytvořil jsem uživatele s názvem testuser1 a přidělili oprávnění DELETE na tblStudent tabulka.
Smažeme záznam studenta s student_code=ST001 :
use StudentDB
go
delete from tblstudent where student_code='ST001'
Spusťte vybrat dotaz na zobrazení dat:
Smazal záznam z tabulky.
ZKRÁTIT TABULKU
Nyní spusťte TRUNCATE TABLE a smažte data:
use StudentDB
go
truncate table tblstudent
Dotaz vrátí následující chybu:
Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.
Abychom to napravili, musíme přidělit oprávnění ALTER TABLE .
Spuštěním následujícího dotazu udělte přístup uživateli testuser1 na tblStudent tabulka:
grant ALTER on tblstudent to testuser1
Znovu spusťte příkaz trucate table:
use StudentDB
go
truncate table tblstudent
Zobrazení dat z tabulky:
Data byla z tabulky odstraněna.
Shrnutí
Tento článek vysvětluje rozdíly mezi příkazem SQL DELETE a příkazem SQL TRUNCATE TABLE. Definovali jsme všechny základní funkce a ilustrovali je na příkladech.