これはうまくいかず、さまざまな形で試してみましたが、常に失敗しました。次の結果を達成する最も簡単な方法は何ですか?
ALTER TABLE XYZ AUTO_INCREMENT = (select max(ID) from ABC);
これは自動化プロジェクトに最適です。ありがとうございました!
SELECT @max := (max(ID)+1) from ABC; -> This works!
select ID from ABC where ID = (@max-1); -> This works!
ALTER TABLE XYZ AUTO_INCREMENT = (@max+1); -> This fails :( Why?
Prepared Statement を使用します:
SELECT @max := MAX(ID)+ 1 FROM ABC;
PREPARE stmt FROM 'ALTER TABLE ABC AUTO_INCREMENT = ?';
EXECUTE stmt USING @max;
DEALLOCATE PREPARE stmt;
以下 mysql docs 、これはmysql 5.7で私のために機能しました:
SET @m = (SELECT MAX(id) + 1 FROM ABC);
SET @s = CONCAT('ALTER TABLE XYZ AUTO_INCREMENT=', @m);
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
アプリケーションの新しいバージョン用の自動データベース変換スクリプトを作成しています。
1つのテーブルで、プライマリ自動インクリメントフィールドを別のフィールドに変更する必要がありました。このページは、解決策をグーグルで検索しているときに何度も最初に表示されたので、最終的に私のために働いた解決策を次に示します。
-- Build a new ID field from entry_id, make it primary and fix the auto_increment for it:
ALTER TABLE `entries` ADD `id` INT UNSIGNED NOT NULL FIRST;
UPDATE entries SET id = entry_id;
ALTER TABLE `entries` ADD PRIMARY KEY ( `id` );
-- ...the tricky part of it:
select @ai := (select max(entry_id)+1 from entries);
set @qry = concat('alter table entries auto_increment=',@ai);
prepare stmt from @qry; execute stmt;
-- ...And now it's possible to switch on the auto_increment:
ALTER TABLE `entries` CHANGE `id` `id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT;
誰がPREPARE stmt FROM 'ALTER TABLE XYZ AUTO_INCREMENT =?'を使用して問題を抱えていますか?
CREATE PROCEDURE reset_xyz_autoincrement
BEGIN
SELECT @max := MAX(ID)+ 1 FROM ABC;
set @alter_statement = concat('ALTER TABLE temp_job_version AUTO_INCREMENT = ', @max);
PREPARE stmt FROM @alter_statement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
自動インクリメントIDをリセットします。
http://community.spiceworks.com/scripts/show/3042-reset-auto-increment-ids
データベース内のすべての自動インクリメント列を、データベース内の現在の値に基づいて可能な最小の値に更新します。データベースをクリーンアップした後、これを行う必要がありました。
ストアドプロシージャ内でプリペアドステートメントを使用します。
drop PROCEDURE if exists reset_autoincrement;
DELIMITER //
CREATE PROCEDURE reset_autoincrement (IN schemaName varchar(255))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE o_name VARCHAR(255);
DECLARE o_table VARCHAR(255);
DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.`COLUMNS` WHERE extra LIKE '%auto_increment%' and table_schema=schemaName;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO o_name, o_table;
IF done THEN
LEAVE read_loop;
END IF;
set @qry1 = concat('SELECT MAX(`',o_name,'`) + 1 as autoincrement FROM `',o_table,'` INTO @ai');
PREPARE stmt1 FROM @qry1;
EXECUTE stmt1;
IF @ai IS NOT NULL THEN
SELECT o_name, o_table;
select @qry1;
select @ai;
set @qry2 = concat('ALTER TABLE `',o_table,'` AUTO_INCREMENT = ', @ai);
select @qry2;
PREPARE stmt2 FROM @qry2;
EXECUTE stmt2;
END IF;
END LOOP;
CLOSE cur1;
END //
DELIMITER ;
call reset_autoincrement('my_schema_name');
わかりました。私はそれほど直感的ではない解決策を考え出しました。最良の部分はそれが機能することです!
SELECT @max := max(ID) from ABC;
ALTER TABLE XYZ AUTO_INCREMENT = 1;
ALTER TABLE XYZ ADD column ID INTEGER primary key auto_increment;
UPDATE XYZ SET ContactID = (ContactID + @max);
個人的には、おそらくシェルスクリプトまたは小さなC#/ C++アプリケーションまたはPHP/Ruby/Perlスクリプトのいずれかを使用して、これを2つのクエリで実行します。
SELECT MAX(ID) FROM ABC;
ALTER TABLE XYZ AUTO_INCREMENT = <insert value retrieved from first query here>
を使用してテーブルを変更します新しい自動インクリメントによってXYZ
テーブル内の既存のデータとキーが衝突しないように注意してください。
MySQLだけでこれを本当に実行したい場合は、動的に構築された変更コマンドをディスク上のファイルにダンプしてから実行するだけです。
そのようです:
select concat('ALTER TABLE XYZ AUTO_INCREMENT = ',max(ID)+1,';') as alter_stmt
into outfile '/tmp/alter_xyz_auto_increment.sql'
from ABC;
\. /tmp/alter_xyz_auto_increment.sql