mail_babir****@yahoo*****
mail_babir****@yahoo*****
2013年 5月 7日 (火) 04:25:30 JST
田辺です。
表題の件についてですが、オートインクリメントについて、他のストレージエンジンと異なる動作がありましたので、ご連絡させて頂きます。
以下再現コードです。
-----------------------
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操作など絡んで来ると主キーはそのまま復元できなければ困ることが多いです。
私と同じ用途での需要は微妙かと思うのですが、他のストレージエンジンと挙動を合わせるという点では有用かと思います。
御対応頂けますと幸いです。
田辺公平