可能なセット/リセットAUTO_INCREMENT
MySQLテーブルの値
ALTER TABLE some_table AUTO_INCREMENT = 1000
ただし、AUTO_INCREMENT
uponその既存の値(M-Mレプリケーションを修正するため)のようなもの:
ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1
機能していません
実際、データベース内のすべてのテーブルに対してこのクエリを実行したいと思います。しかし、実際にはこれはそれほど重要ではありません。
クエリを手動で実行する以外は、この問題に対処する方法を見つけることができませんでした。何か提案したり、アイデアを教えてください。
ありがとう
使用:
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ステートメントを実行します。
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'
次に、コピーして貼り付け、得られた出力を実行します。
以下の手順では、[括弧]内にあるすべてのものを正しい値に置き換える必要があります。試行する前にバックアップします。
コマンドラインから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]
これらのコマンドを使用したことにより生じたいかなる損害についても、私は責任を負いません。自己責任で使用してください。
N:M関係を分解するテーブルの外部キーではなく自動インクリメント列を修正してこれを修正する必要があり、適切な値を予測できる場合は、関連する列がある一時テーブルを使用してみてください自動インクリメントではない場合、これを元のテーブルの代わりにマップし、後で列タイプを自動インクリメントに変更するか、元のテーブルを切り捨てて一時テーブルからデータをロードします。
私は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...
下記の手順でデータベース名を変更して実行しました
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();