sql >> Databáze >  >> RDS >> Sqlserver

Rozdíl mezi tabulkou DELETE a TRUNCATE na serveru SQL Server

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.


  1. Naučte se importovat data aplikace Excel do databáze MySQL

  2. Jak získat Insert id v MSSQL v PHP?

  3. Získávání dat z uložené procedury pomocí Entity Framework

  4. Getting Error – ORA-01858:Na místě, kde se očekávala číslice, byl nalezen nečíselný znak