Много статии са написани, за да опишат разликата между изразите SQL DELETE и SQL TRUNCATE. Освен това, това е един от най-често срещаните въпроси по време на интервюта за работа. И двата израза премахват данните от таблицата. Има обаче и разлики.
Тази статия ще се фокусира върху тези разлики и ще ги илюстрира с практически примери.
Резюме на разликите изтриване срещу съкращаване
Отрязване на таблица | Дирекция DELETE |
Изтрива всички записи от таблицата. Не можем да приложим клаузата WHERE за премахване на конкретни записи. | Премахва всички записи и може да приложи клаузата WHERE за изтриване на конкретни записи. |
Не задейства DELETE задействане. | Изпълнява DELETE задействане. |
Нулира стойността на самоличността. | Не нулира стойността на самоличността. |
По-бърз е поради минимално използване на регистъра на транзакциите. | По-бавно е поради извършване на първоначално сканиране на таблицата за преброяване на броя на редовете за изтриване и премахване на редове един по един. Промените се записват в регистрационните файлове на транзакциите. |
Използва заключването на ниво ред. | Използва заключването на ниво таблица. |
Не може да се използва с индексирани изгледи. | Може да се използва с индексирани изгледи. |
Изисква ALTER TABLE разрешение. | Изисква ИЗТРИВАНЕ разрешение на масата. |
За демонстрационни цели създадох таблица с име studentDB . Там направих две маси, tblSchool иtblStudent и вмъкнах някои записи в двете таблици.
Следният скрипт създава tblStudent таблица:
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
Този скрипт създава tblSchool таблица:
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
Следният скрипт вмъква данни в tblStudent таблица:
/*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
Скриптът по-долу вмъква данни в tblSchool таблица:
insert into [dbo].[tblSchool] ([school_name], [city])
values
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')
Сега, нека идентифицираме разликите между твърденията.
Разлика 1:Изтриване на данните
Командата DELETE работи за премахване на конкретни/всички записи от таблицата. Инструкцията TRUNCATE изтрива всички данни.
Ще проучим този сценарий.
Изтриване на изявление
За да премахнем конкретни записи с DELETE, можем да използваме клаузата WHERE в заявката. Да предположим, че искаме да изтрием някои ученици от tblstudent таблица, кодът на ученика е ST002 .
Добавете филтъра в израза DELETE, както следва:
Delete from tblstudent where student_code='ST002'
Тази заявка ще изтрие само един запис от таблицата.
След като записът бъде изтрит, стартирайте select заявка за преглед на данните:
Select * from tblstudent
Изявление TRUNCATE TABLE
В таблицата за съкращаване добавянето на клаузата WHERE е невъзможно.
Следната заявка премахва всички записи от tblStudent таблица:
Truncate table tblStudent
Разлика 2:Тригери
Когато изпълним командата DELETE, SQL Server извиква тригерите DELETE.
Създадох тригер с име trgdeleteStudent наtblStudent . Когато изпълняваме оператор DELETE на tblstudent таблица, тригерът вмъква запис в tblDeletedStudent таблица.
T-SQL кодът за създаване на tbldeletedStudent е следното:
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 кодът по-долу създава тригера:
create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE
AS
INSERT INTO [dbo].[tblDelatedStudents](student_code)
SELECT student_code
FROM DELETED;
GO
Изпълнете заявката по-долу, за да изтриете записа на ученика ST0001 :
delete from tblstudent where student_code='ST001'
Изпълнете следната заявка, за да потвърдите:
select * from [dbo].[tblDelatedStudents]
Както можете да видите на горната екранна снимка, към таблицата е добавен запис.
Сега нека изпълним оператора TRUNCATE TABLE, за да премахнем данните от tblstudent таблица:
Truncate table [dbo].[tblDelatedStudents]
Проверете данните чрез заявка за tblDeletedStudent :
select * from [dbo].[tblDelatedStudents]
Както можете да видите, записите не са били вмъкнати в таблицата tblDeletedStudent .Така trgdeletestudent спусъкът не се задейства.
Разлика 3:Нулиране на стойностите на идентичността
Когато изпълним командата DELETE, стойностите на идентичността няма да се нулират до първоначалните стойности. За изпълнение на израза на таблица TRUNCATE стойността на идентичността ще се нулира.
Изтриване на изявление
Изпълнете оператора DELETE по-долу, за да изтриете данните от tblStudent таблица:
delete from tblStudent where student_code='ST004'
След това изпълнете следната заявка за вмъкване за добавяне на записи към tblStudent таблицата:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('Ramesh Upadhyay','ST007','B',2)
Go
Изпълнете следната заявка, за да видите данните на tblStudent :
select * from [dbo].[tblStudent]
Изображението по-горе показва, че първоначалната стойност на колоната за идентичност се увеличава с единица.
СЪСЪРЗВАНЕ НА ТАБЛИЦА
Изпълнете оператора TRUNCATE TABLE по-долу, за да изтриете данните от tblStudent таблица:
Truncate table [dbo].[tblStudents]
След като данните бъдат изтрити, вмъкнете записи в таблицата:
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
Изпълнете заявката SELECT, за да видите данните:
select * from [dbo].[tblStudent]
Както можете да видите на изображението по-горе, стойността на самоличността е нулирана.
Разлика 4:Разрешения
За да премахнем данни с помощта на оператора DELETE, трябва да имаме разрешение DELETE на таблицата.
За да премахнем данните с помощта на израза TRUNCATE TABLE, се нуждаем от разрешение ALTER TABLE.
Изтриване на изявление
Създадох потребител на име testuser1 и зададе разрешение за ИЗТРИВАНЕ на tblStudent таблица.
Изтриваме записа на ученика с student_code=ST001 :
use StudentDB
go
delete from tblstudent where student_code='ST001'
Стартирайте избора заявка за преглед на данни:
Това изтри записа от таблицата.
СЪСЪРЗВАНЕ НА ТАБЛИЦА
Сега стартирайте TRUNCATE TABLE, за да изтриете данните:
use StudentDB
go
truncate table tblstudent
Заявката връща следната грешка:
Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.
За да коригираме това, трябва да зададем разрешение ALTER TABLE .
Изпълнете следната заявка, за да предоставите достъп на testuser1 вtblStudent таблица:
grant ALTER on tblstudent to testuser1
Изпълнете отново оператора за truncate table:
use StudentDB
go
truncate table tblstudent
Вижте данните от таблицата:
Данните са премахнати от таблицата.
Резюме
Тази статия обяснява разликите между оператора SQL DELETE и оператора SQL TRUNCATE TABLE. Дефинирахме всички основни характеристики и ги илюстрирахме с примери.