15

特定のテスト データ セットをデータベースに生成するスクリプトをセットアップしようとしています。その開始時に、制約を削除せずに関連するテーブルをクリアしたい (テスト データは制約を再構築するのに適切な場所ではないため)。多くの ID をハードコーディングできれば、テスト データの設定がはるかに簡単になるため、各テーブルの AUTO_INCREMENT をリセットします。

たとえば、次のような 2 つのステートメントがあります (ほぼすべてのテーブルにペアがあります)。

DELETE FROM AppointmentAttr
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1

レコードが削除されている間、自動インクリメント値は1に戻りません.

MySQL Workbench で同じステートメントを実行しても元に戻りません。

これは INNODB データベースにあります。

私は何が欠けていますか?

(注: 制約が存在するため、TRUNCATE を使用できません)。

4

9 に答える 9

17

MySQL では、http: //dev.mysql.com/doc/refman/5.6/en/alter-table.htmlで指定されているように、AUTO_INCREMENT 値を減らすことはできません。

現在使用されている値以下の値にカウンターをリセットすることはできません。InnoDB と MyISAM の両方で、値が AUTO_INCREMENT カラムの現在の最大値以下の場合、値は AUTO_INCREMENT カラムの現在の最大値に 1 を加えた値にリセットされます。

制約があっても、次のいずれかを試します。

  1. テスト データの ID を明示的に挿入します。他のデータベース エンジンとは異なり、MySQL にはこれに関する問題はありません。
  2. 制約がそれ自体にない場合は、ID 列を削除して再作成します (または単に ID から変更します)。
  3. ID 列を使用せず、別の方法 (手順や外部コードなど) を使用して ID を制御します。これは本当に最後の手段であり、一般的にはお勧めしません...

OPからのメモ:私が必要としていたのは(1)でした。

于 2013-07-17T01:58:27.400 に答える
9

alter tableステートメントについて私が見ることができるものから。

ALTER TABLE ステートメントを使用して、自動インクリメント値をリセットできます。自動インクリメント値をリセットする ALTER TABLE ステートメントの構文は次のとおりです。

ALTER TABLE table_name AUTO_INCREMENT = value;

ALTER TABLE 句の後にテーブル名を指定し、式 AUTO_INCREMENT = value でリセットする値を指定します。

この値は、自動インクリメント列の現在の最大値以上である必要があることに注意してください。

あなたの問題はどこにあると思いますか。したがって、基本的には、次のようにいくつかのオプションが残されています。

  1. TRUNCATE TABLE: 私たちの議論によると、これはオプションではありません
  2. テーブルの削除と再作成: 長くてつらい経験
  3. ALTER auto number column: 私はこれを試していませんが、理論的には主キー列を auto number から int に変更してから、再度 auto number にすることができます。何かのようなもの:

    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT NOT NULL;
    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT AUTONUMBER NOT NULL;
    

これらが少し役立つことを願っています。

于 2013-07-17T01:57:33.033 に答える
0

問題のない状況では、次のことができます

ALTER TABLE tbl AUTO_INCREMENT = 0;

これにより、auto_increment 値がその時点で許可されている最低値になります。

于 2016-02-13T22:43:20.470 に答える
0

これは私にとってはうまくいきました。 SET @autoid = 0; UPDATE users set id = @autoid := (@autoid+1); ALTER TABLE users AUTO_INCREMENT = 1;

于 2021-07-02T15:14:45.737 に答える