20

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

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

4

6 に答える 6

24

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

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

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

于 2010-04-08T16:19:56.550 に答える
15

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

ALTER TABLE t2 AUTO_INCREMENT = value
于 2010-04-08T16:17:26.953 に答える
5

   テーブルが別のテーブルの親でない限り、問題のテーブルをドロップします。

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

于 2012-09-10T09:26:47.317 に答える
2

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

于 2010-04-08T16:17:40.790 に答える
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;
于 2012-09-10T09:02:54.737 に答える