columnのdrop

sqlで面白そうなことやってたのでツッこんでみる
結果つけたら結構でかくなったのでこっちで。

まずはテストテーブルの作成

sqlite> .explain on
sqlite> create table test (
   ...>         id integer,
   ...>         field1 text
   ...> );

カラムの追加

sqlite> alter table test add column field2 text;
sqlite> insert into test values (1, 'field1', 'field2');
sqlite> select * from test;
id    field1          field2
 ----  --------------  ----------
1     field1          field2

カラムの削除

sqlite> alter table test drop column field1;
SQL error: near "drop": syntax error

試してみたところ確かにdrop column使えませんね。

しかーし

sqlite> alter table test rename to temp;
sqlite> select * from temp;
id    field1          field2
 ----  --------------  ----------
1     field1          field2

テーブルのリネームは可能です。
そこで旧テーブルからいらないカラムをドロップしたテーブルを作り直し・・・

sqlite> create table test (
   ...>         id integer,
   ...>         field2 text
   ...> );

insert into table_name select・・・でリネームしたテーブルから残ったカラムのデータをコピーすれば・・・

sqlite> insert into test select id, field2 from temp;
sqlite> select * from test;
id    field2
 ----  --------------
1     field2

カラムのドロップをしたテーブルができあがります。

sqlite> drop table temp;
sqlite> select * from temp;
SQL error: no such table: temp

あとはいらなくなった旧テーブルを削除すればOK。

たしか昔のバージョンだったかのMySQLだったかでのdrop column方法としてどっかで載ってた方法だったはずです。もしかしたらPostgreSQLだったかもしれませんが・・・

元のテーブルがもつカラム名とか型がわからないと新規に作り直せないので多少面倒ですけど(データベースによってはシステムディクショナリなどから存在するテーブル情報やカラム情報を取り出すことが出来、簡単に作れるデータベースもあります)。