ALTER TABLEの解決法
SQLiteのバージョン3以上であれば、ALTER TABLEのADDコマンドで項目の追加が出来ますがMySQL並に細かな変更は行えません。
SQLite Frequently Asked QuestionsにあるようにTEMPORARY使った方法を紹介します。
都道府県データを入力する
idとnameのシンプルなテーブルを作成します。CREATE TABLE prefecture_tbl ( id integer NOT NULL, name varchar(128), PRIMARY KEY (id) ); INSERT INTO prefecture_tbl (name) VALUES ('茨城県'); INSERT INTO prefecture_tbl (name) VALUES ('栃木県'); INSERT INTO prefecture_tbl (name) VALUES ('群馬県'); INSERT INTO prefecture_tbl (name) VALUES ('埼玉県'); INSERT INTO prefecture_tbl (name) VALUES ('千葉県'); INSERT INTO prefecture_tbl (name) VALUES ('東京都'); INSERT INTO prefecture_tbl (name) VALUES ('神奈川県'); INSERT INTO prefecture_tbl (name) VALUES ('新潟県'); SELECT * FROM prefecture_tbl;
| id | name |
| 1 | 茨城県 |
| 2 | 栃木県 |
| 3 | 群馬県 |
| 4 | 埼玉県 |
| 5 | 千葉県 |
| 6 | 東京都 |
| 7 | 神奈川県 |
| 8 | 新潟県 |
TEMPORARYを使ったalter
都道府県名に加えてエリア項目を追加する必要が発生しました。ALTER TABLEはSQLite version 3.1.3からやっと使えるものになったので
バージョンが低いと項目の追加などが行えません。
そこで、現在あるデータをTEMPORARYに保存してからテーブルを作り直し
TEMPORARYのデータを新しいテーブルに移し変える方法を取ります。
/* 安全のためトランザクションを宣言します */ BEGIN TRANSACTION; /* TEMPORARYエリアに保存用のテーブルを作成 */ CREATE TEMPORARY TABLE prefecture_tbl_alter ( id integer, name varchar(128), area varchar(128) ); /* 変更前のデータを保存 */ INSERT INTO prefecture_tbl_alter SELECT *,'関東・信越' AS area FROM prefecture_tbl; /* テーブルの作り直し */ DROP TABLE prefecture_tbl; CREATE TABLE prefecture_tbl ( id integer NOT NULL, name varchar(128), area varchar(128), PRIMARY KEY (id) ); /* TEMPORARYデータをもとに復旧 */ INSERT INTO prefecture_tbl SELECT * FROM prefecture_tbl_alter; /* 途中エラーがあればROLLBACK */ COMMIT; SELECT * FROM prefecture_tbl;
| id | name | area |
| 1 | 茨城県 | 関東・信越 |
| 2 | 栃木県 | 関東・信越 |
| 3 | 群馬県 | 関東・信越 |
| 4 | 埼玉県 | 関東・信越 |
| 5 | 千葉県 | 関東・信越 |
| 6 | 東京都 | 関東・信越 |
| 7 | 神奈川県 | 関東・信越 |
| 8 | 新潟県 | 関東・信越 |
/* SQLite version 3.1.3以上の場合 */ ALTER TABLE prefecture_tbl ADD area varchar(128); VACUUM; UPDATE prefecture_tbl SET area = '関東・信越';
