sql >> データベース >  >> RDS >> Sqlserver

SQLServerのDELETEテーブルとTRUNCATEテーブルの違い

    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ステートメントの違いについて説明しました。すべての重要な機能を定義し、例を挙げて説明しました。


    1. 最も難しい質問のヘルプのための最高のSQLServerパフォーマンスフォーラム

    2. Android Room Database、入力された最新のレコードの特定の値を取得します

    3. MySQLデータベースサービス–新しいHeatWaveイノベーション

    4. MySQL8.0をRHEL/CentOS8/7およびFedora35にインストールする方法