須藤です。 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