web-dev-qa-db-ja.com

MySQLデータベースのすべてのテーブルのAUTO_INCREMENT値を更新する

可能なセット/リセットAUTO_INCREMENT MySQLテーブルの値

ALTER TABLE some_table AUTO_INCREMENT = 1000

ただし、AUTO_INCREMENTuponその既存の値(M-Mレプリケーションを修正するため)のようなもの:

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1機能していません

実際、データベース内のすべてのテーブルに対してこのクエリを実行したいと思います。しかし、実際にはこれはそれほど重要ではありません。

クエリを手動で実行する以外は、この問題に対処する方法を見つけることができませんでした。何か提案したり、アイデアを教えてください。

ありがとう

30
pars

使用:

ALTER TABLE some_table AUTO_INCREMENT = 0

... auto_increment列の既存の最大値に基づいて、auto_increment値を次の値にリセットします。

これをすべてのテーブルに対して実行するには、ALTER TABLEステートメントのテーブル名を変数として指定できないため、 MySQLのPreparedStatementsと呼ばれる動的SQL構文 を使用する必要があります。次からの出力をループする必要があります。

SELECT t.table_name
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_schema = 'your_database_name'

...各テーブルに対して上記のALTER TABLEステートメントを実行します。

42
OMG Ponies
set @db = 'your_db_name';

SELECT concat('ALTER TABLE ', @db, '.', TABLE_NAME, ' AUTO_INCREMENT = 0;') 
FROM information_schema.TABLES WHERE TABLE_SCHEMA = @db AND TABLE_TYPE = 'BASE TABLE'

次に、コピーして貼り付け、得られた出力を実行します。

15
the_nuts

以下の手順では、[括弧]内にあるすべてのものを正しい値に置き換える必要があります。試行する前にバックアップします。

コマンドラインからrootとしてmysqlにログインできる場合は、次のようにしてすべてのテーブルのauto_incrementをリセットできます。最初に、実行するクエリを作成します。

データベースのバックアップを作成します。

mysqldump -u [uname] -p [dbname] | gzip -9 > [backupfile.sql.gz]

ログインする:

mysql -u root -p

Group_concat_max_lengthをより高い値に設定して、クエリのリストが切り捨てられないようにします。

SET group_concat_max_len=100000;

以下を使用してクエリのリストを作成します。

SELECT GROUP_CONCAT(CONCAT("ALTER TABLE ", table_name, " AUTO_INCREMENT = 0") SEPARATOR ";") FROM information_schema.tables WHERE table_schema = "[DATABASENAME]";

次に、mysqlクエリの長​​い文字列とそれに続く一連のダッシュを受け取ります。クエリの文字列をクリップボードにコピーすると、次のようになります。

ALTER table1 AUTO_INCREMENT = 0;ALTER table2 AUTO_INCREMENT = 0;...continued...

コマンドを実行するデータベースに変更します。

USE [DATABASENAME];

次に、クリップボードにある文字列を貼り付け、Enterキーを押して実行します。これにより、データベース内のすべてのテーブルで変更が実行されます。

めちゃくちゃ?バックアップから復元し、以下を実行する前にmysqlからログアウトしてください(これを行うには、exit;と入力するだけです)。

gzip -d < [backupfile.sql.gz] | mysql -u [uname] -p [dbname]

これらのコマンドを使用したことにより生じたいかなる損害についても、私は責任を負いません。自己責任で使用してください。

6
nicholas.alipaz

N:M関係を分解するテーブルの外部キーではなく自動インクリメント列を修正してこれを修正する必要があり、適切な値を予測できる場合は、関連する列がある一時テーブルを使用してみてください自動インクリメントではない場合、これを元のテーブルの代わりにマップし、後で列タイプを自動インクリメントに変更するか、元のテーブルを切り捨てて一時テーブルからデータをロードします。

1
symcbean

私はgithubでこのGistを見つけ、それは私にとって魅力のように機能しました: https://Gist.github.com/abhinavlal/4571478

コマンド:

mysql -Nsr -e "SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t WHERE t.table_schema = 'DB_NAME'" | xargs -I {} mysql DB_NAME -e "ALTER TABLE {} AUTO_INCREMENT = 1;"

DBにパスワードが必要な場合、残念ながらそれを機能させるためにコマンドに入力する必要があります。回避策の1つ(まだgreatではありませんが機能します)は、パスワードを安全なファイルに置くことです。パスワードはコマンド履歴に残らないように、後からいつでもファイルを削除できます。

 ... | xargs -I {} mysql -u root -p`cat /path/to/pw.txt` DB_NAME -e...
1
Yes Barry

下記の手順でデータベース名を変更して実行しました

CREATE DEFINER=`root`@`localhost` PROCEDURE `setAutoIncrement`()
BEGIN
DECLARE done int default false;
    DECLARE table_name CHAR(255);
DECLARE cur1 cursor for SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t 
        WHERE t.table_schema = "buzzer_verifone";

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    open cur1;

    myloop: loop
        fetch cur1 into table_name;
        if done then
            leave myloop;
        end if;
        set @sql = CONCAT('ALTER TABLE ',table_name, ' AUTO_INCREMENT = 1');
        prepare stmt from @sql;
        execute stmt;
        drop prepare stmt;
    end loop;

    close cur1;
END

以下の行を使用して上記の手順を実行します

Call setAutoIncrement();
0
Lovesh Pareek