SQLDELETEステートメントとSQLTRUNCATEステートメントの違いを説明するために多くの記事が書かれています。さらに、それは就職の面接中に最も一般的な質問の1つです。どちらのステートメントも、テーブルからデータを削除します。ただし、違いもあります。
この記事では、これらの違いに焦点を当て、実際の例でそれらを説明します。
削除と切り捨ての違いの概要
TruncateTableステートメント | DELETEステートメント |
テーブルからすべてのレコードを削除します。 WHERE句を適用して特定のレコードを削除することはできません。 | すべてのレコードを削除し、WHERE句を適用して特定のレコードを削除できます。 |
DELETEを起動しません トリガー。 | DELETEを実行します トリガー。 |
ID値をリセットします。 | ID値をリセットしません。 |
トランザクションログの使用が最小限であるため、高速です。 | 削除する行数をカウントするための初期テーブルスキャンを実行し、行を1つずつ削除するため、処理速度が低下します。変更はトランザクションログに記録されます。 |
行レベルのロックを使用します。 | テーブルレベルのロックを使用します。 |
インデックス付きビューでは使用できません。 | インデックス付きビューで使用できます。 |
ALTER TABLEが必要です 許可。 | DELETEが必要です テーブルの許可。 |
デモンストレーションの目的で、 studentDBという名前のテーブルを作成しました 。そこで、 tblSchoolという2つのテーブルを作成しました。 および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ステートメント
DELETEを使用して特定のレコードを削除するには、クエリでWHERE句を使用できます。 tblstudentから一部の学生を削除するとします。 表では、学生のコードは ST002 。
次のように、DELETEステートメントにフィルターを追加します。
Delete from tblstudent where student_code='ST002'
このクエリは、テーブルから1つのレコードのみを削除します。
レコードが削除されたら、選択を実行します データを表示するためのクエリ:
Select * from tblstudent
TRUNCATETABLEステートメント
切り捨てテーブルでは、WHERE句を追加することはできません。
次のクエリは、 tblStudentからすべてのレコードを削除します テーブル:
Truncate table tblStudent
違い2:トリガー
DELETEコマンドを実行すると、SQLServerはDELETEトリガーを呼び出します。
trgdeleteStudentという名前のトリガーを作成しました tblStudent 。 tblstudentでDELETEステートメントを実行すると テーブルの場合、トリガーは tblDeletedStudentにレコードを挿入します テーブル。
tbldeletedStudentを作成するためのT-SQLコード 次のとおりです:
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:ID値のリセット
DELETEコマンドを実行しても、ID値は初期値にリセットされません。 TRUNCATEテーブルステートメントの実行では、ID値がリセットされます。
DELETEステートメント
以下の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]
上の画像は、ID列の初期値が1つ増えていることを示しています。
テーブルの切り捨て
以下のTRUNCATETABLEステートメントを実行して、 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]
上の画像でわかるように、ID値はリセットされています。
違い4:権限
DELETEステートメントを使用してデータを削除するには、テーブルに対するDELETE権限が必要です。
TRUNCATE TABLEステートメントを使用してデータを削除するには、ALTERTABLE権限が必要です。
DELETEステートメント
testuser1という名前のユーザーを作成しました tblStudentにDELETE権限を割り当てました テーブル。
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
.
これを修正するには、ALTERTABLE権限を割り当てる必要があります 。
次のクエリを実行して、 testuser1へのアクセスを許可します tblStudent テーブル:
grant ALTER on tblstudent to testuser1
切り捨てテーブルステートメントを再実行します:
use StudentDB
go
truncate table tblstudent
表のデータを表示します:
データはテーブルから削除されました。
概要
この記事では、SQLDELETEステートメントとSQLTRUNCATETABLEステートメントの違いについて説明しました。すべての重要な機能を定義し、例を挙げて説明しました。