Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Różnica między tabelą DELETE i TRUNCATE w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konfiguracje w zakresie bazy danych SQL Server i automatyczna korekta planu

  2. Odpowiednik funkcji Sleep() w SQL Server:instrukcja WAITFOR

  3. Dodaj krok zadania do istniejącego zadania agenta serwera SQL (T-SQL)

  4. Dowiedz się, jak korzystać z programu SQL Server Management Studio

  5. Utwórz schemat UDF związany ze schematem w SQL Server