MySQL TRUNCATE TABLEステートメントは、MySQLテーブルからすべてのレコードを削除するために使用されるDDLステートメントです。このコマンドを実行すると、最初に既存のテーブルが削除され、次にテーブル定義を使用して新しいテーブルが作成されます。 TRUNCATETABLEコマンドのクエリ実行シーケンスはDROPTABLEとCREATETABLEです。
TRUNCATETABLEステートメントの特徴は次のとおりです。
- 行を削除する代わりにTRUNCATETABLEステートメントを実行すると、MySQLはテーブルを削除して再作成します。特に大きなテーブルの場合、DELETEステートメントよりも高速です。
- TRUNCATE TABLEは、DELETEトリガーをバイパスして、高いパフォーマンスを実現します。
- TRUNCATE TABLEは、暗黙的なコミットを引き起こすため、ロールバックできません。
- アトミックDDLでサポートされているストレージエンジンを使用していて、TRUNCATE TABLE操作中にサーバーが停止した場合、トランザクションは完全にコミットまたはロールバックされます。
- AUTO_INCREAMENT列の値を開始値にリセットします。
- InnoDBまたはNDBテーブルに外部キーを作成した場合、TRUNCATETABLEステートメントは失敗します。
- テーブルまたはインデックスが破損していて、テーブル定義が有効であっても、TRUNCATETABLEステートメントは空のテーブルを再作成します。
- TRUNCATE TABLEステートメントは、パーティション化を保持します。インデックスファイルとデータは削除されますが、パーティション定義は影響を受けません。
- 破損したInnoDBテーブルを切り捨てることができます。
- テーブルごとのファイルテーブルスペースを使用している場合、TRUNCATE TABLEステートメントはテーブルスペースを削除し、新しいテーブルスペースを作成します。
- パフォーマンススキーマサマリーテーブルで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コマンドの違いに精通し、概念を明確にするためにいくつかの実用的な例を検討しました。