Napisano wiele artykułów opisujących różnice między instrukcjami SQL DELETE i SQL TRUNCATE. Co więcej, jest to jedno z najczęściej zadawanych pytań podczas rozmów kwalifikacyjnych. Obie instrukcje usuwają dane z tabeli. Jednak są też różnice.
W tym artykule skupimy się na tych różnicach i zilustrujemy je praktycznymi przykładami.
Podsumowanie różnic między usuwaniem a przycinaniem
Oświadczenie Obetnij tabelę | DELETE oświadczenie |
Usuwa wszystkie rekordy z tabeli. Nie możemy zastosować klauzuli WHERE do usunięcia określonych rekordów. | Usuwa wszystkie rekordy i może zastosować klauzulę WHERE, aby usunąć określone rekordy. |
Nie uruchamia DELETE wyzwalacz. | Wykonuje USUŃ wyzwalacz. |
Resetuje wartość tożsamości. | Nie resetuje wartości tożsamości. |
Jest szybszy dzięki minimalnemu zużyciu dziennika transakcji. | Jest wolniejszy ze względu na wykonanie wstępnego skanowania tabeli w celu zliczenia liczby wierszy do usunięcia i usunięcia wierszy jeden po drugim. Zmiany są rejestrowane w dziennikach transakcji. |
Używa blokady na poziomie wiersza. | Używa blokady na poziomie tabeli. |
Nie można używać z widokami indeksowanymi. | Może być używany z widokami indeksowanymi. |
Wymaga ALTER TABLE pozwolenie. | Wymaga USUŃ uprawnienia na stole. |
W celach demonstracyjnych utworzyłem tabelę o nazwie studentDB . Tam zrobiłem dwa stoły, tblSchool i tblStudent i wstawił kilka rekordów w obu tabelach.
Poniższy skrypt tworzy 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
Ten skrypt tworzy 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
Poniższy skrypt wstawia dane do tabeli Student 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
Poniższy skrypt wstawia dane do tblSchool tabela:
insert into [dbo].[tblSchool] ([school_name], [city])
values
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')
Teraz zidentyfikujmy różnice między stwierdzeniami.
Różnica 1:Usuwanie danych
Polecenie DELETE działa w celu usunięcia określonych/wszystkich rekordów z tabeli. Instrukcja TRUNCATE usuwa wszystkie dane.
Zbadamy ten scenariusz.
DELETE oświadczenie
Aby usunąć określone rekordy za pomocą DELETE, możemy użyć w zapytaniu klauzuli WHERE. Załóżmy, że chcemy usunąć niektórych uczniów z tabeli studenckiej tabeli, kod ucznia to ST002 .
Dodaj filtr w instrukcji DELETE w następujący sposób:
Delete from tblstudent where student_code='ST002'
To zapytanie usunie tylko jeden rekord z tabeli.
Po usunięciu rekordu uruchom wybierz zapytanie, aby wyświetlić dane:
Select * from tblstudent
Oświadczenie TRUNCATE TABLE
W tabeli obcinania dodanie klauzuli WHERE jest niemożliwe.
Następujące zapytanie usuwa wszystkie rekordy z tblStudent tabela:
Truncate table tblStudent
Różnica 2:wyzwalacze
Kiedy uruchamiamy polecenie DELETE, SQL Server wywołuje wyzwalacze DELETE.
Utworzyłem wyzwalacz o nazwie trgdeleteStudent na tblStudent . Kiedy wykonujemy instrukcję DELETE na tabeli studenckiej tabeli, wyzwalacz wstawia rekord w tblDeletedStudent tabela.
Kod T-SQL do tworzenia tbldeletedStudent jest następująca:
CREATE TABLE [dbo].[tblDelatedStudents]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Student_Code] [varchar](10) NULL,
CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)
Poniższy kod T-SQL tworzy wyzwalacz:
create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE
AS
INSERT INTO [dbo].[tblDelatedStudents](student_code)
SELECT student_code
FROM DELETED;
GO
Uruchom poniższe zapytanie, aby usunąć rekord ucznia ST0001 :
delete from tblstudent where student_code='ST001'
Uruchom następujące zapytanie, aby zweryfikować:
select * from [dbo].[tblDelatedStudents]
Jak widać na powyższym zrzucie ekranu, do tabeli został dodany rekord.
Teraz uruchommy instrukcję TRUNCATE TABLE, aby usunąć dane z tabeli studenckiej tabela:
Truncate table [dbo].[tblDelatedStudents]
Zweryfikuj dane, wysyłając zapytanie do tblDeletedStudent :
select * from [dbo].[tblDelatedStudents]
Jak widać, rekordy nie zostały wstawione do tabeli tblDeletedStudent .Tak więc trgdeletestudent spust nie zadziałał.
Różnica 3:Resetowanie wartości tożsamości
Kiedy wykonamy polecenie DELETE, wartości tożsamości nie zostaną zresetowane do wartości początkowych. W przypadku wykonania instrukcji tabeli TRUNCATE wartość tożsamości zostanie zresetowana.
DELETE oświadczenie
Uruchom poniższą instrukcję DELETE, aby usunąć dane z tblStudent tabela:
delete from tblStudent where student_code='ST004'
Następnie wykonaj następujące wstaw zapytanie aby dodać rekordy do tblStudent stół:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('Ramesh Upadhyay','ST007','B',2)
Go
Uruchom następujące zapytanie, aby wyświetlić dane tblStudent :
select * from [dbo].[tblStudent]
Powyższy obrazek pokazuje, że początkowa wartość kolumny tożsamości jest zwiększana o jeden.
OBCIĘCIE TABELI
Uruchom poniższą instrukcję TRUNCATE TABLE, aby usunąć dane z tblStudent tabela:
Truncate table [dbo].[tblStudents]
Po usunięciu danych wstaw rekordy do tabeli:
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
Uruchom zapytanie SELECT, aby wyświetlić dane:
select * from [dbo].[tblStudent]
Jak widać na powyższym obrazku, wartość tożsamości została zresetowana.
Różnica 4:Uprawnienia
Aby usunąć dane za pomocą instrukcji DELETE, musimy mieć do tabeli uprawnienie DELETE.
Aby usunąć dane za pomocą instrukcji TRUNCATE TABLE, potrzebujemy uprawnienia ALTER TABLE.
DELETE oświadczenie
Utworzyłem użytkownika o nazwie testuser1 i przypisał uprawnienie DELETE do tabeli Student tabela.
Usuwamy rekord ucznia z student_code=ST001 :
use StudentDB
go
delete from tblstudent where student_code='ST001'
Uruchom wybierz zapytanie, aby wyświetlić dane:
Usunął rekord z tabeli.
OBCIĘCIE TABELI
Teraz uruchom TRUNCATE TABLE, aby usunąć dane:
use StudentDB
go
truncate table tblstudent
Zapytanie zwraca następujący błąd:
Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.
Aby to naprawić, musimy przypisać uprawnienie ALTER TABLE .
Uruchom następujące zapytanie, aby przyznać dostęp użytkownikowi testuser1 na tabeli Student tabela:
grant ALTER on tblstudent to testuser1
Ponownie uruchom instrukcję obcinania tabeli:
use StudentDB
go
truncate table tblstudent
Wyświetl dane z tabeli:
Dane zostały usunięte z tabeli.
Podsumowanie
W tym artykule wyjaśniono różnice między instrukcją SQL DELETE a instrukcją SQL TRUNCATE TABLE. Zdefiniowaliśmy wszystkie podstawowe funkcje i zilustrowaliśmy je przykładami.