裏MySQL 歯抜けになったプライマリキーを採番しなおす。

まずはサンプルのテーブルの定義

CREATE TABLE `item` (
`item_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`item_name` VARCHAR( 255 ) NOT NULL
) ENGINE = IONNODB ;
INSERT INTO item (item_name) VALUES 
('みかん'),
('リンゴ'),
('バナナ'),
('トマト'),
('オレンジ');

データを削除する

DELETE FROM item WHERE item_id=4;

採番しなおす

SET @N:=0;
UPDATE item SET item_id=@N:=@N+1 
ORDER BY item_id ASC

ユーザー変数を使う場合は、並び順が重要になってくる、ORDER BY item_id ASC が肝
指定しなくても、成功する場合もあるが、実行内容が保障されない。

SET @MAX:=(SELECT MAX(item_id) FROM item)+1;
SET @SQL=CONCAT('ALTER TABLE item AUTO_INCREMENT = ',@MAX);

PREPARE init_auto_inc FROM @SQL;
EXECUTE init_auto_inc ;

オートインクリメントの内容は修正されない為、MAX値+1に修正する。
ALTER文はDDLの為プリペアで動的に実行

尚、以下のようにプライマリキーのカラムを削除して作り直しても1から順に歯抜けなく採番されます。ただし、一度プライマリキーのカラムの内容が削除される為、rowid(MySQLでは直接操作・閲覧不可)順に採番される。レコードを削除した後にレコードの追加をしなければプライマリキーの順で並んでいると思われる為問題ないかと思いますが、大抵の場合汚くなったマスターデータを綺麗にしたいという場合に行うかと思いますので、前者の方法が無難です。

ALTER TABLE  `item` DROP  `item_id`; 
ALTER TABLE  ADD  `item_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY  FIRST;