[groonga-dev,04710] Re: Mroonga でテーブルをキーに使っているカラムを含むテーブルの、他のカラムを ALTER COLUMN で変更できない

Back to archive index
Kouhei Sutou kou****@clear*****
2018年 11月 7日 (水) 18:25:18 JST


須藤です。

In <CAEQ84Lau+zhw_J5RSSRPs=cBMVK****@mail*****>
  "[groonga-dev,04709] Mroonga でテーブルをキーに使っているカラムを含むテーブルの、他のカラムを ALTER COLUMN で変更できない" on Tue, 6 Nov 2018 07:19:33 +0900,
  6ellll <6elll****@gmail*****> wrote:

> ベクターカラムを使ってタグを検索するようなテーブルを作ります。
> 
> CREATE TABLE tags (
>   name VARCHAR(64) PRIMARY KEY
> ) ENGINE=Mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
> 
> CREATE TABLE entry (
>   id INT PRIMARY KEY AUTO_INCREMENT,
>   state INT DEFAULT 1,
>   tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "tags"',
>   FULLTEXT INDEX entry_tags_index(tags) COMMENT 'table "tags"'
> ) ENGINE=Mroonga DEFAULT CHARSET=utf8;
> 
> この状態で、ベクターカラムや参照先の tags テーブルと関係ないはずの
> state カラムに対する ALTER TABLE ~ ALTER COLUMN ~ 構文の操作が効かなくなります。
> 例えば以下のようなものです。
> 
> ALTER TABLE entry ALTER COLUMN state DROP DEFAULT;
> ALTER TABLE entry ALTER COLUMN state SET DEFAULT 0;
> ALTER TABLE entry MODIFY COLUMN state VARCHAR(30);
> などなど。
> 
> これらは失敗して次のエラーが出ます。
> #1005 - [table][remove] a column that references the table exists:
> <#sql-2d5a_e3.tags> -> <tags>

これはエラーメッセージが悪いですね。。。
直しておきました。

本当の原因はtagsテーブルに同じ名前のインデックスカラムを作ろ
うとしていることです。どうしてそうなるかというと、問題となる
ALTER TABLEを実行したときにテーブルのコピーを策しているから
です。

ALTER TABLEはインプレースで適用できるやつとできないやつがあっ
て、適用できないやつは新しい定義でテーブルを作ってデータをコ
ピーしてできあがったら既存のテーブルと差し替えます。つまり、
一時的に2つのテーブルができます。このとき、新しいテーブルが
tagsテーブルに同じ名前のインデックスカラムを作ろうとしてエラー
になっています。

どうするのがいいかしら。
インデックス名も一時テーブルな名前にしておいてALTER TABLEが
終わったらリネームするのがいいのかしら。
考えてみます。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <https://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
データ処理ツールの開発:
  https://www.clear-code.com/blog/2018/7/11.html


More information about the groonga-dev mailing list
Back to archive index