web-dev-qa-db-ja.com

MySQLのテーブルをクリーンアップするには、削除、切り捨て、またはドロップします

テーブルをクリーンアップしようとしていますが、テーブルの実際の構造を削除していません。自動インクリメントされるid列があります。 ID番号を保持する必要はありませんが、自動インクリメント特性を保持するために必要です。削除と切り捨てを見つけましたが、これらのいずれかがテーブル全体を完全に削除して、将来の挿入コマンドが役に立たなくなるのではないかと心配しています。

新しいデータを挿入できるように、テーブルからすべてのレコードを削除するにはどうすればよいですか?

19
Doug Molineux

TRUNCATEは自動インクリメントシードをリセットします(少なくともInnoDBテーブルでは)。ただし、切り捨てる前にその値をメモし、後で alter table を使用してそれに応じて再設定できます。

ALTER TABLE t2 AUTO_INCREMENT = value
14
davek

drop tableデータを含むテーブル全体を削除します

delete * from tableはデータを削除し、自動インクリメント値はそのままにします。テーブルに大量のデータがある場合も、しばらく時間がかかります。

truncate tableはデータを削除し、自動インクリメント値をリセットし(ただし、自動インクリメント列のままにするため、1から開始して、そこから再び上昇します)、非常に高速です。

22
chris

Drop テーブルが別のテーブルの親でない限り、問題のテーブルを削除します。

削除 条件を満たすすべてのデータを削除します。条件が指定されていない場合は、テーブル内のすべてのデータが削除されます。
切り捨てる と類似しています 削除;ただし、auto_incrementカウンターを1(または初期開始値)にリセットします。ただし、削除よりも切り捨てを使用することをお勧めします。 削除 各行でデータを削除するため、パフォーマンスが低下します。 切り捨てる。しかしながら、 切り捨てる 動作しません InnoDB 参照整合性が強制されるテーブルは、 切り捨てる コマンドが発行されます。
だから、リラックスしてください。あなたが発行しない限り drop テーブルのコマンド、それはドロップされません。

4

テーブルの切り捨てはあなたが探しているものです http://www.1keydata.com/sql/sqltruncate.html

2
george9170

もう1つの可能性は、テーブルの空のコピーを作成し、AUTO_INCREMENTを設定して(非アトミック操作中に挿入するための最終的な余裕を持って)、両方を回転させることです。

CREATE TABLE t2_new LIKE t2;

SELECT @newautoinc:=auto_increment /*+[leeway]*/ 
  FROM information_schema.tables
 WHERE table_name='t2';

SET @query = CONCAT("ALTER TABLE t2_new AUTO_INCREMENT = ", @newautoinc);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

RENAME TABLE t2 TO t2_old, t2_new TO t2;

そして、古いテーブルを削除する前に気が変わってもよいという追加の利点があります。

決定を再検討した場合でも、操作の前にテーブルから古いレコードを戻すことができます。

INSERT /*IGNORE*/ INTO t2 SELECT * FROM t2_old /*WHERE [condition]*/;

うまくいったら、古いテーブルを削除できます。

DROP TABLE t2_old;
1
Vincent B.

フルテキストのInnoDBクエリでのTRUNCATEと比較して、DELETEがSELECTのパフォーマンスに大幅な影響を与えている状況に遭遇しました。

すべての行を削除してからテーブル(100万行)を再入力すると、通常のクエリは1秒で返されます。

代わりに、テーブルを切り捨てて、まったく同じ方法で再入力した場合、通常のクエリが返されるまでに0.05秒かかります。

YMMVですが、何らかの理由でMariaDB 10.3.15-MariaDB-log DELETEを使用すると、インデックスが台無しになっているようです。

0
Codemonkey