kentoku
kento****@gmail*****
2013年 5月 8日 (水) 23:32:47 JST
斯波です。 MySQLのオートインクリメントの挙動は、全ストレージエンジンで共通という訳ではなく、 MyISAMの場合は、田辺さんの求める挙動になるのですが、 InnoDBの場合は、インスタンスを再起動すると起動後最初にオートインクリメント値が 必要になったタイミングで、その時の最大値をもとに採番されるため、 過去に削除された値が再度払いだされることがあり得ます。 こちらの回避策ですが、mroongaの場合はラッパーモードをサポートしておりますので、 MyISAMのテーブルをラップして利用して頂くか、 MySQLのリファレンスマニュアルに紹介されているシークエンスのシミュレーションの手法で 払いだした番号を別テーブルで管理するという方式があります。 http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html (のLAST_INSERT_IDのところ) こちらではいかがでしょうか? どうぞ、よろしくお願いします。 2013年5月7日 4:25 <mail_babir****@yahoo*****>: > 田辺です。 > > 表題の件についてですが、オートインクリメントについて、他のストレージエンジンと異なる動作がありましたので、ご連絡させて頂きます。 > > 以下再現コードです。 > ----------------------- > CREATE TABLE `test` ( > `id` int(11) NOT NULL AUTO_INCREMENT, > `main` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci', > PRIMARY KEY (`id`) > ) ENGINE=innodb DEFAULT CHARSET=utf8; > > INSERT INTO `test`(`main`) VALUES ('1'); > DELETE FROM `test` WHERE `id` = 1; > INSERT INTO `test`(`main`) VALUES ('2'); > id:2のレコードが挿入される > > > CREATE TABLE `test2` ( > `id` int(11) NOT NULL AUTO_INCREMENT, > `main` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci', > PRIMARY KEY (`id`) > ) ENGINE=mroonga DEFAULT CHARSET=utf8; > > INSERT INTO `test2`(`main`) VALUES ('1'); > DELETE FROM `test2` WHERE `id` = 1; > INSERT INTO `test2`(`main`) VALUES ('2'); > id:1のレコードが挿入される > --------------------- > > > 最新のレコードが削除され、新たにレコードが追加された場合、mroongaは削除された主キー値が再利用されるのに対して、他のストレージエンジンでは主キー値の再利用はされません。 > > 一見mroongaの方が効率のいい処理をしているように見えるのですが、私の使用環境ではこの動作が問題となってしまいました。 > > > レコードの論理削除に変わる方法として、トリガーを設定するなどして削除に連動させて退避テーブルへ対象レコード内容をすべて挿入して内容を残すという方法があります。 > > > ここで、退避テーブルに移したレコードを元のテーブルに戻したい場合に、単純に主キー値も指定した状態で挿入をすると、mroongaの場合は重複エラーが出てしまう場合があります。 > > > 具体的には、元テーブルの最新レコードを退避テーブルへ移動させ、その後元テーブルで新規挿入があった場合、先ほどの退避テーブルのレコードを元テーブルへ戻そうとすると重複となります。 > > 主キーを指定しなければレコードの復元はできるのですが、join操作など絡んで来ると主キーはそのまま復元できなければ困ることが多いです。 > > 私と同じ用途での需要は微妙かと思うのですが、他のストレージエンジンと挙動を合わせるという点では有用かと思います。 > > 御対応頂けますと幸いです。 > > > 田辺公平 > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev >