MySQL Truncate の使用方法の詳細な説明

MySQL Truncate の使用方法の詳細な説明

テーブル内のデータを削除するには、削除と切り捨ての 2 つの方法があります。TRUNCATE TABLE は、個々の行の削除操作を記録せずにテーブル内のすべての行を削除するために使用されます。 TRUNCATE TABLE は、WHERE 句のない DELETE ステートメントに似ていますが、TRUNCATE TABLE の方が高速で、使用するシステム リソースとトランザクション ログ リソースが少なくなります。以下はSQLにおけるTruncateの使い方について説明しています。

テーブルが不要になった場合は drop を使用します。テーブルを保持しながらすべてのレコードを削除する場合は truncate を使用します。一部のレコードを削除する場合 (常に WHERE 句を使用) は delete を使用します。

Truncate は、テーブル内のすべてのデータをすばやくクリアできる SQL 構文です。また、カウントをゼロにリセットし、自動的に増分された値でフィールドを再計算することもできます。

MySQL 切り捨ての使用

1. 構文を切り捨てる

[ { データベース名.[ スキーマ名 ]. | スキーマ名. } ]
テーブル名
[; ]

パラメータ

データベース名
データベースの名前。

スキーマ名
テーブルが属するスキーマの名前。

テーブル名
切り捨てられるテーブルの名前、または行が削除されるテーブルの名前。

2. Truncateの使用上の注意

1. TRUNCATE TABLE は、WHERE 句のない DELETE ステートメントと機能的に同じです。どちらもテーブル内のすべての行を削除します。ただし、TRUNCATE TABLE は DELETE よりも高速で、使用するシステム リソースとトランザクション ログ リソースが少なくなります。

2. DELETE ステートメントは一度に 1 行を削除し、削除された行ごとにトランザクション ログにエントリを記録します。 TRUNCATE TABLE は、テーブル データの格納に使用されたデータ ページを解放することによってデータを削除し、トランザクション ログにページの解放のみを記録します。

3. TRUNCATE TABLE はテーブル内のすべての行を削除しますが、テーブル構造とその列、制約、インデックスなどは変更されません。新しい行を識別するために使用されるカウント値は、列のシードにリセットされます。 ID カウント値を保持する場合は、代わりに DELETE を使用します。テーブル定義とそのデータを削除する場合は、DROP TABLE ステートメントを使用します。

4. FOREIGN KEY 制約によって参照されるテーブルの場合、TRUNCATE TABLE は使用できません。代わりに、WHERE 句のない DELETE ステートメントを使用する必要があります。 TRUNCATE TABLE はログに記録されないため、トリガーをアクティブ化できません。

5. TRUNCATE TABLE は、インデックス ビューに参加しているテーブルには使用できません。

6. TRUNCATE TABLE を使用して削除されたテーブルにデータを追加する場合は、UPDATE STATISTICS を使用してインデックス情報を維持します。

7. ROLLBACK ステートメントがある場合、DELETE 操作は元に戻されますが、TRUNCATE は元に戻されません。

3. TRUNCATE TABLEは次のテーブルでは使用できません

1. FOREIGN KEY 制約によって参照されるテーブル。 (自分自身を参照する外部キーを持つテーブルを切り捨てることができます。)

2. インデックス ビューに参加するテーブル。

3. トランザクション レプリケーションまたはマージ レプリケーションを使用して公開されたテーブル。

4. 上記の特性の 1 つ以上を持つテーブルの場合は、DELETE ステートメントを使用します。

5. TRUNCATE TABLE 操作では個々の行の削除が記録されないため、トリガーをアクティブ化できません。

IV. TRUNCATE、Drop、Deleteの違い

1. Drop と Delete では、テーブルのデータ (定義) のみが削除されます。Drop ステートメントでは、テーブル構造、依存制約、トリガー、およびインデックスが削除されます。テーブルに依存するストアド プロシージャ/関数は保持されますが、無効になります。
2. 削除ステートメントは DML 言語です。この操作はロールバック セグメントに配置され、トランザクションがコミットされた後にのみ有効になります。対応するトリガーがある場合は、実行時にトリガーされます。切り捨てと削除は DDL 言語です。これらは操作後すぐに有効になります。元のデータはロールバックの対象にならず、ロールバックできません。この操作によってトリガーはトリガーされません。

3. 削除ステートメントはテーブルが占有する範囲に影響を与えず、高水準点は元の位置に残ります。 drop ステートメントは、テーブルによって占有されているすべてのスペースを解放します。デフォルトでは、再利用ストレージが使用されない限り、truncate ステートメントは minexents の範囲までスペースを解放します。切り捨ては最高水準点をリセットします(最初に戻ります)。

4. 効率: 削除 > 切り捨て > 削除

5. セキュリティ: 特にバックアップがない場合は、drop と truncate を慎重に使用してください。一部のデータを削除する場合は、where 句を指定した delete を使用できます。ロールバック セグメントは十分な大きさである必要があります。テーブルを削除する場合は、drop を使用できます。テーブルを保持したままテーブル内のすべてのデータを削除したい場合は、トランザクションに関連しない場合は truncate を使用できます。トランザクションに関連している場合やトリガーをトリガーする場合は、delete を使用します。テーブル内のフラグメントを整理する場合は、truncate の後に reuse stroage を使用し、データを再インポートして挿入します。

6.delete は DML ステートメントであり、自動的には送信されません。 Drop/truncate はどちらも DDL ステートメントであり、実行後に自動的にコミットされます。

7. Drop は通常、テーブル、スキーマ、インデックス、ビュー、整合性制約などのデータ全体を削除するために使用されます。delete は、テーブル内のタプルなどのローカル データを削除するために使用されます。

8. DROPはテーブル構造を削除します。DELETEはデータのみをクリアします。

9. テーブルが不要になった場合は drop を使用します。テーブルを保持したまますべてのレコードを削除する場合は truncate を使用します。一部のレコードを削除する場合 (常に WHERE 句を使用) は delete を使用します。

MYSQL における TRUNCATE と DELETE の違い

MYSQL では、TRUNCATE と DELETE の両方でテーブル内のデータをクリーンアップできますが、それらの違いは何でしょうか?以下の点から分析します。

1. 条件付き削除

これは、DELETE には WHERE 句があり、条件付き削除をサポートしているため理解しやすいですが、TRUNCATE ではテーブル全体の削除しかできません。

# 削除 - 条件付き削除 DELETE FROM student WHERE id = 1;
# delete - テーブル全体のデータを削除します DELETE FROM student;
# truncate - テーブル全体のデータを削除します TRUNCATE TABLE student;

2. トランザクションのロールバック

DELETE はデータ操作言語 (DML) であるため、元のデータは操作中にロールバック セグメントに配置され、ロールバックできます。一方、TRUNCATE はデータ定義言語 (DDL) であるため、元のデータは操作中に保存されず、ロールバックできません。

DELETE が正常にロールバックできることがわかります。

TRUNCATE を正常にロールバックできないことがわかります。

3. 清掃速度

データ量が比較的少ない場合、DELETE と TRUNCATE のクリーンアップ速度の差はそれほど大きくありません。しかし、データ量が多い場合には、その違いが見られます。 2 番目の項目で述べたように、TRUNCATE はロールバックをサポートする必要がないため、使用するシステム リソースとトランザクション ログ リソースが少なくなります。 DELETE ステートメントは、一度に 1 行ずつ削除し、削除された行ごとにトランザクション ログにエントリを記録します。処理は遅いですが、比較的安全です。

4. ハイウォーターマークのリセット

テーブル レコードに対する DML 操作が継続的に実行されると、テーブルの最高水準点 (HWM) は増加し続けます。DELETE 操作後にテーブル内のデータは削除されますが、テーブルの最高水準点は下がりません。DML 操作が発生すると、データベース容量は減少するのではなく、増加するだけです。したがって、DELETE を使用すると、テーブル内のデータが大幅に削減された場合でも、クエリ速度は DELETE 操作前と同じになります。
TRUNCATE 操作により最高水準点がリセットされ、データベース容量もリセットされ、後続の DML 操作の速度も向上します。

MySQL Truncate の使用法補足

序文:

テーブルをクリアしたいときは、truncate ステートメントをよく使用します。ほとんどの場合、私たちは、そのようなステートメントの使用シナリオや注意事項を考えずに、ニーズが満たされるかどうかだけを気にします。この記事では主にtruncate文の使い方と注意点について紹介します。

1. 使用構文を切り捨てる

truncate の機能は、テーブルをクリアするか、テーブルを切り捨てることであり、テーブル上でのみ使用できます。 truncate の構文は非常にシンプルで、テーブル名を続けるだけです。

たとえば、 truncate table tbl_nameまたはtruncate tbl_name

truncate ステートメントを実行するには、テーブルに対する drop 権限が必要です。論理的には、truncate table は、すべての行を削除する delete ステートメント、または drop table と create table ステートメントの組み合わせに似ています。高いパフォーマンスを実現するために、データを削除する DML メソッドをバイパスし、ロールバックできないようにします。 truncate table は delete に似ていますが、DML ステートメントではなく DDL ステートメントとして分類されます。

2. 切り捨て、ドロップ、削除の比較

前述のように、truncate は delete や drop と非常によく似ています。しかし、実際には、これら 3 つの間には依然として大きな違いがあります。以下は、3 つの類似点と相違点の簡単な比較です。

  • truncate と drop は DDL ステートメントであり、実行後にロールバックすることはできません。delete は DML ステートメントであり、ロールバックできます。
  • 切り捨てはテーブルにのみ適用できますが、削除とドロップはテーブル、ビューなどに適用できます。
  • Truncate はテーブル内のすべての行をクリアしますが、テーブル構造とその制約、インデックスなどは変更されません。drop はテーブル構造とそれが依存する制約、インデックスなどを削除します。
  • 切り捨てはテーブルの自動増分値をリセットしますが、削除はリセットしません。
  • 切り捨てではテーブルに関連付けられた削除トリガーはアクティブになりませんが、削除ではアクティブになります。
  • 切り捨て後、テーブルとインデックスが占めるスペースは初期サイズに復元されます。削除操作ではテーブルまたはインデックスが占めるスペースは削減されず、drop ステートメントによってテーブルが占めるスペースがすべて解放されます。

3. 使用シナリオと注意事項を切り捨てる

これまでの紹介を通じて、truncate ステートメントの使用シナリオを簡単に導き出すことができます。つまり、テーブル データが完全に不要な場合に truncate を使用できます。一部のデータを削除する場合は、delete を使用し、where 句を含めることを忘れないでください。テーブルを削除する場合は、もちろん drop を使用します。テーブルを保持してすべてのデータを削除し、それがトランザクションとは関係がない場合は、truncate を使用します。トランザクションに関連している場合、またはトリガーをトリガーする場合は、やはり delete を使用します。テーブル内のフラグメントを整理する場合は、truncate を使用してからデータを再挿入できます。

いずれにしても、テーブルの切り捨てはリスクの高い操作であり、特に本番環境ではより注意する必要があります。ここでは注意すべき点をいくつか挙げますので、使用時の参考にしていただければ幸いです。

  • 切り捨ては binlog を通じてロールバックできません。
  • Truncate はすべてのデータをクリアし、非常に高速に実行します。
  • 切り捨ては、外部キー制約によって参照されるテーブルでは使用できません。
  • truncate を実行するには、ドロップ権限が必要です。アカウントにドロップ権限を与えることは推奨されません。
  • truncate を実行する前に必ず再度確認し、確認してください。事前に以下のテーブルデータをバックアップしておくことをお勧めします。

以上がMySQL Truncateの詳しい使い方の詳しい内容です。MySQL Truncateの詳細については、123WORDPRESS.COMの他の関連記事もご覧ください。

以下もご興味があるかもしれません:
  • MYSQL での Truncate の使用法の詳細な説明
  • MySQL での Truncate の使用法の詳細な説明

<<:  Ubuntu 20.04の新バージョンでルートユーザーを使用してシステムにログインする方法の詳細なチュートリアル

>>:  React+axios は github 検索ユーザー機能を実装します (サンプル コード)

推薦する

CSS に基づいて MaterialUI ボタン​​クリックアニメーションを実装し、それを React コンポーネントにカプセル化します。

序文フロントエンドフレームワークのヘビーユーザーとして、私はテクノロジーを選択する際にそのエコロジー...

設定ファイルを変更した後、操作を再開します

余計なことは言わないで、コードだけ見てみましょう〜 # docker-compose をダウン # ...

DockerコンテナがJupyterにアクセスできない問題の解決策

このプロジェクトでは、環境を構築するために Docker コンテナを使用します。Dockerfile...

Docker 基本チュートリアル: Dockerfile 構文の詳細な説明

序文Dockerfile は Docker プログラムによって解釈されるスクリプトです。Docker...

Vue.js での VNode の使用

VNodeとはvue.js には VNode クラスがあり、これを使用してさまざまな種類の vnod...

Linux での mysql-5.7.28 インストール チュートリアル

1. 公式ウェブサイトから Linux バージョンをダウンロードします: https://dev.m...

CSS3で実装された読み込みアニメーション

成果を達成する実装コード <h1>123WORDPRESS.COM</h1>...

Nginxにモジュールを動的に追加する方法

前面に書かれた多くの場合、現在のプロジェクトの状況とビジネスニーズに基づいて Nginx をインスト...

MySQL マスタースレーブレプリケーション構成プロセス

メインライブラリの構成1. MySQLを設定する vim /etc/my.cn # ファイルに次の内...

MyISAMとInnoDBの違いについてお話しましょう

主な違いは次のとおりです。 1. MySQL はデフォルトで MyISAM を使用します。 2. M...

Firefox で Flash を再生するためのオブジェクトとパラメータの書き方

コードをコピーコードは次のとおりです。 <object classid="clsid...

CSS3 境界効果

CSSとは# CSS (Cascading Style Sheets の略) は、「カスケーディング...

Docker プルタイムアウトの解決策

最近、Docker イメージのプルが非常に不安定です。遅く、タイムアウトすることがよくあります。 x...

JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明

目次JS スリーマウンテンズ同期 非同期同期と非同期の違い範囲、終了関数スコープチェーンブロックスコ...

IE8 と Chrome でテーブルの幅を修正する方法

IE8 や Chrome で上記の設定を使用すると、画面の最大幅に合わせて表示が統一され、各列の幅は...