[groonga-dev,01375] mroongaストレージモードでのオートインクリメントについて

Back to archive index

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操作など絡んで来ると主キーはそのまま復元できなければ困ることが多いです。

私と同じ用途での需要は微妙かと思うのですが、他のストレージエンジンと挙動を合わせるという点では有用かと思います。

御対応頂けますと幸いです。


田辺公平




groonga-dev メーリングリストの案内
Back to archive index