[groonga-dev,03078] Re: [ANN] Mroonga 4.10

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 2月 2日 (月) 19:09:11 JST


須藤です。

少し補足します。

In <20150****@clear*****>
  "[groonga-dev,03077] [ANN] Mroonga 4.10" on Thu, 29 Jan 2015 14:18:13 +0900,
  HAYASHI Kentaro <hayas****@clear*****> wrote:

> 今日は肉の日(1/29)、Mroonga 4.10をリリースしました。
> 
>   http://mroonga.org/ja/docs/news.html#release-4-10
> 
> みなさんからのフィードバックをお待ちしています!
> 
> ドキュメント:
>   http://mroonga.org/ja/
> インストールガイド:
>   http://mroonga.org/ja/docs/install.html
> アップグレード方法:
>   http://mroonga.org/ja/docs/upgrade.html
>
> 今回のリリースでは、エラー発生時に意図せずテーブルが削除されてしまったり、
> インデックスが削除されてしまったり、データを壊してしまう不具合を修正しています。
> 既存のMroongaユーザーはアップグレードをおすすめしています。

これなんですが、ストレージモードでUNIQUE INDEXを使っている人
は強くアップグレードをオススメします。というのは、UNIQUE
INDEXを張っていても重複した値を持つレコードを登録できてしま
うバグが直っているからです。

(対象の方、すみません。。。)

次のようなケースで重複した値を持つレコードを登録できてしまい
ます。

  1. UNIQUE INDEXを作る
  2. データを挿入する
  3. 重複したデータを挿入する
     (エラーが報告されて挿入はされない。が、WHEREで見つからなくなる)
  4. 再度重複したデータを挿入する
     →重複したデータを挿入できる

SQLでいうと↓で確認できます。↓でコメント通りの挙動になった
て、UNIQUE INDEXを使っている人はアップグレードを強くオススメ
します。

----

CREATE TABLE users (
 id int PRIMARY KEY,
 name varchar(100) NOT NULL,
 UNIQUE INDEX (name)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;

INSERT INTO users VALUES (1, "Alice");

INSERT INTO users VALUES (2, "Bob");
-- ↓はエラーになる
INSERT INTO users VALUES (3, "Bob");
-- ↓で3, "Bob"を参照できる
SELECT * FROM users;
-- けど、↓で3, "Bob"が見つからない
SELECT * FROM users WHERE name = "Bob";
-- ↓はエラーにならずに登録できる
INSERT INTO users VALUES (4, "Bob");

----


なお、アップグレード後はUNIQUE INDEXを作成し直す必要がありま
す。一度削除してから同じパラメーターで作り直すということです。
このとき、すでに重複した値があれば「重複したレコードがある
よ!」みたいなエラーがでます。そのときはデータを確認して慎重
にデータを修正してください。

なお、UNIQUE INDEXを作りなおすのが面倒という方は↓というよう
にしても作り直せます。ただ、UNIQUE INDEXに関わらず、すべての
インデックスを作り直すので数が多い場合は効率がよくありません。

--
ALTER TABLE ${YOUR_TABLE} DISABLE KEYS;
ALTER TABLE ${YOUR_TABLE} ENABLE KEYS;
--

お手数をおかけしますが、確認の上、対象の方はアップグレードを
おねがいします。




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