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

実用的な例によるMySQLTRUNCATETABLEの理解

    MySQL TRUNCATE TABLEステートメントは、MySQLテーブルからすべてのレコードを削除するために使用されるDDLステートメントです。このコマンドを実行すると、最初に既存のテーブルが削除され、次にテーブル定義を使用して新しいテーブルが作成されます。 TRUNCATETABLEコマンドのクエリ実行シーケンスはDROPTABLEとCREATETABLEです。

    TRUNCATETABLEステートメントの特徴は次のとおりです。

    1. 行を削除する代わりにTRUNCATETABLEステートメントを実行すると、MySQLはテーブルを削除して再作成します。特に大きなテーブルの場合、DELETEステートメントよりも高速です。
    2. TRUNCATE TABLEは、DELETEトリガーをバイパスして、高いパフォーマンスを実現します。
    3. TRUNCATE TABLEは、暗黙的なコミットを引き起こすため、ロールバックできません。
    4. アトミックDDLでサポートされているストレージエンジンを使用していて、TRUNCATE TABLE操作中にサーバーが停止した場合、トランザクションは完全にコミットまたはロールバックされます。
    5. AUTO_INCREAMENT列の値を開始値にリセットします。
    6. InnoDBまたはNDBテーブルに外部キーを作成した場合、TRUNCATETABLEステートメントは失敗します。
    7. テーブルまたはインデックスが破損していて、テーブル定義が有効であっても、TRUNCATETABLEステートメントは空のテーブルを再作成します。
    8. TRUNCATE TABLEステートメントは、パーティション化を保持します。インデックスファイルとデータは削除されますが、パーティション定義は影響を受けません。
    9. 破損したInnoDBテーブルを切り捨てることができます。
    10. テーブルごとのファイルテーブルスペースを使用している場合、TRUNCATE TABLEステートメントはテーブルスペースを削除し、新しいテーブルスペースを作成します。
    11. パフォーマンススキーマサマリーテーブルでTRUNCATETABLEを使用できますが、テーブルのデータは削除されません。サマリー列の値をNULLまたはゼロ(0)にリセットします。

    DELETEテーブルステートメントとTRUNCATEテーブルステートメントの違い

    Sr。 DELETEステートメント TRUNCATETABLEステートメント
    1 DELETEステートメントはDMLステートメントです。変更はデータベースのバイナリログに記録されます。 TRUNCATETABLEステートメントはDDLステートメントです。操作はバイナリログに記録されません。
    2 操作はロールバックできます。 この操作はロールバックできません。
    3 変更がバイナリログに記録され、DMLトリガーが実行されるため、処理が遅くなります。 既存のテーブルを削除して新しいテーブルを作成するため、高速です。
    4 DELETEステートメントは行レベルのロックを取得します。 TRUNCATE TABLEは、データを削除する前にデータページをロックします。
    5 WHERE句を使用して特定のレコードを削除できます テーブルを切り捨てると、テーブルからすべてのデータが削除されます。

    実際のTRUNCATETABLEステートメントの使用

    TruncateTableステートメントの構文は次のとおりです。

    TRUNCATE TABLE [DatabaseName].[TABLE_NAME]

    注:レコードを削除するテーブルの名前は、 TRUNCATE TABLEの後にあります 声明。 tblStudentを切り捨てたいとします。 テーブル。クエリは次のようになります。

    TRUNCATE TABLE tblStudent

    デモンストレーションのために、MySQL 8.0サーバーをインストールし、 studentsDBという名前のデータベースを作成しました。 。そこで、 tblStudentという名前のテーブルを作成しました tblSchool、 およびtblStudentCounsiler。

    次のスクリプトは、データベースとテーブルを作成します。

    Create database studentDB;
    
    CREATE TABLE studentDB.tblstudent (
      studentID integer NOT NULL AUTO_INCREMENT,
      StudentName varchar(255) DEFAULT NULL,
      StudentGrade char(1) DEFAULT NULL,
      SchoolID int,
      PRIMARY KEY (studentID)
    )
    ENGINE = INNODB;
    
    CREATE TABLE studentDB.tblschool (
      SchoolID int NOT NULL AUTO_INCREMENT,
      SchoolName varchar(255) DEFAULT '',
      City varchar(255) DEFAULT '',
      PRIMARY KEY (SchoolID)
    )
    ENGINE = INNODB;
    
    CREATE TABLE studentDB.tblStudentCounsiler (
      CounsilerID int NOT NULL AUTO_INCREMENT,
      CounsilerName varchar(255) DEFAULT '',
      PRIMARY KEY (CounsilerID)
    )
    ENGINE = INNODB;
    

    tblStudentに外部キーを作成しました SchoolIDを参照するテーブル tblStudentの列 テーブル。

    外部キーを作成するためのスクリプトは次のとおりです。

    ALTER TABLE studentDB.tblstudent
    ADD CONSTRAINT FK_tblstudent_SchoolID FOREIGN KEY (SchoolID)
    REFERENCES studentDB.tblschool (SchoolID) ON DELETE NO ACTION;
    

    ER図は以下のとおりです。

    次のスクリプトは、合計されたデータをすべてのテーブルに挿入します。

    Use studentDB;
    
    insert INTO tblSchool(SchoolName,City) VALUES ('Nalanda School','Mehsana');
    insert INTO tblSchool(SchoolName,City) VALUES ('Sarvajanik School','Mehsana');
    insert INTO tblSchool(SchoolName,City) VALUES ('Diwan Ballubhai','Ahmedabad');
    
    INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Nisarg Upadhyay','A',1);
    INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Nirali Upadhyay','A',2);
    INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Manushi Upadhyay','C',3);
    INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Dixit Upadhyay','B',1);
    INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Bharti Upadhyay','A',1);
    
    INSERT INTO tblStudentCounsiler (CounsilerName) VALUES ('Raghav Dave');
    INSERT INTO tblStudentCounsiler (CounsilerName) VALUES ('Keyur Dalwadi');
    INSERT INTO tblStudentCounsiler (CounsilerName) VALUES ('Sawan Panchal');
    

    それでは、ユースケースを理解しましょう。

    まず、 tblStudentCounsilerを切り捨てましょう。 次のクエリで:

    mysql> truncate table studentdb.tblStudentCounsiler;

    出力

    Query OK, 0 rows affected (0.08 sec)

    SELECTステートメントを実行してデータを表示します:

    mysql> select * from studentdb.tblStudentCounsiler;

    クエリ出力:

    Empty set (0.01 sec)

    上のスクリーンショットでわかるように、コマンドは正常に実行されました。

    それでは、 tblSchoolを切り捨ててみましょう。 次のクエリを含むテーブル:

    mysql> Truncate table tblSchool;

    別のテーブルによって参照されているテーブルを切り捨てることができないため、次のエラーが発生します。

    ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`studentdb`.`tblstudent`, CONSTRAINT `FK_tblstudent_SchoolID`)

    このエラーを修正するには、外部キーを削除する必要があります。次のクエリを実行して実行します。

    mysql> ALTER TABLE tblstudent DROP FOREIGN KEY FK_tblstudent_SchoolID;

    クエリ出力:

    Query OK, 0 rows affected (0.03 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    外部キーが削除されたら、truncatetableコマンドを実行します。

    mysql> Truncate table tblSchool;

    クエリ出力:

    Query OK, 0 rows affected (0.08 sec)

    概要

    現在の記事では、TRUNCATETABLEステートメントとその特性を紹介しました。 TRUNCATE TABLEコマンドとDELETEコマンドの違いに精通し、概念を明確にするためにいくつかの実用的な例を検討しました。


    1. MySQLでAUTO_INCREMENTを読み取ってリセットする方法

    2. 接続が悪くなったときにJBoss接続プールをOracleに再接続する方法はありますか?

    3. SQLiteインデックス

    4. FILESTREAMを使用したSQLデータベースへのファイルの保存–パート1