Mysql/sqlserver、つまりdelete/truncateについて頭に浮かんだこと
どちらが良いと速いですか?
削除を使用する場所?
切り捨てを使用する場所?
[〜#〜] delete [〜#〜]
[〜#〜] truncate [〜#〜]
最も重要な違いは、DELETE操作はトランザクションに対して安全であり、ログに記録されることです。つまり、DELETEをロールバックできます。 TRUNCATEはトランザクション内で実行できず、ロールバックできません。 TRUNCATEはログに記録されないため、誤って切り捨てられたテーブルの回復は、DELETEからの回復よりもはるかに大きな問題です。
外部キー制約が壊れている場合、DELETEは失敗します。 TRUNCATEは、外部キー制約を尊重しない場合があります(InnoDBテーブルに対してはそうします)。 DELETEは、ON DELETEトリガーを起動します。 TRUNCATEはしません。
切り捨て操作はテーブルを削除して再作成します。これは、特に大きなテーブルの場合、1行ずつ削除するよりもはるかに高速です。
テーブルが空に設定され、自動インクリメントキーを1にリセットする必要がある場合。すべてのデータを削除するため、DELETEよりも高速です。 DELETEはテーブルをスキャンして、影響を受けた行の数を生成します。
オプションのWHERE句に基づいて削除する行が必要です。ログが必要で、外部キー制約を適用する
DELETE
コマンドは、テーブルから行を削除するために使用されます
TRUNCATE
は、テーブルからすべての行を削除します。操作はロールバックできず、トリガーは起動されません。そのため、TRUNCATE
はより高速で、DELETE
ほど多くの取り消しスペースを使用しません。
差:
1)テーブルから完全なデータを削除すると、次の自動インクリメントIDは1から始まります。削除は次のIDから始まります。
2)両方とも、構造をそのまま保持し、データのみを削除します。
3)deleteを使用すると、truncateの場合とは異なり、limitを使用できます。