うつろぐ

文章

SQliteでカラム定義変更(カラム名変更、属性変更など)を行う最短ルート暫定版

大学の講義でSQLite使い始めたんですけど、けっこうたのしいですね。今まで研究室のサーバーにあるMySQLを使ってたんですが、あれみたいにくそでかい管理機構があってそこで色々するんじゃなくて、DBがファイル単位でさらっと管理できるのがたのしいです。ウケます。利便性というよりは感覚的な問題。

SQLiteはまあそんな感じで敷居が低くて、更に色々な言語や環境から扱えるのでステキです。なんかProcessingからも操作できるらしい。ほえ~。

ただ、他のDBでは標準で実装されてる機能がSQLiteには平気でなかったりします。今回のカラム定義変更がその一つです。今回はこれをなんとかしてやります。

 

大まかな流れ

適当な名前で新しいカラム定義を持ったtableを作る(1コマンド)

→元のtableのデータを全部同じ並びで新tableにぶち込む(1コマンド)

→元のtableを消す(1コマンド)

→新tableの名前を元のtableの名前にする(1コマンド)

 

やってみよう

今回この画像のようなtableを使います。

f:id:Distorted_Unchi:20171129234443p:plain

このtableについて、

・idをPRIMARY KEY&AUTOINCREMENTにしたい

・nameをusernameにしたい

という想定でやっていきます

 

適当な名前で新しいカラム定義を持ったtableを作る

先程の要件を満たしたtableを作って、tempとか脳が死んだような名前をつけます。

f:id:Distorted_Unchi:20171129235008j:plain

カラム数が多いtableに対して変更が1つとかだと本当にしんどいです。逆に、複数の変更をまとめて一遍にできるのでそのようなときには楽な方法になります。

 

元のtableのデータを全部同じ並びで新tableにぶち込む

ここが一番知名度の低い操作。insertの引数(?)にselect節をとります。

f:id:Distorted_Unchi:20171129235442j:plain

この構文は

insert into [table](ca1,ca2,ca3) select cb1,cb2,cb3 from [table];

のようにすることもできます。ここでcaとcbの数は同じでなければなりません。

 

元のtableを消す

なんで画像で説明してんだってくらい簡単な操作。

f:id:Distorted_Unchi:20171130000123j:plain

間違えてtempや他のtableをdropしないように注意...

あと消す前にtempにちゃんとデータが移ってるか1回確認したほうがいいかも。

 

新tableの名前を元のtableの名前にする

カラムのrenameは1コマンドでできない癖にtableのrenameは1コマンドでできるのでやります。

f:id:Distorted_Unchi:20171130000407j:plain

これでカラム定義の変更が完了しました。

 

結果

f:id:Distorted_Unchi:20171130001344j:plain

できた。いえ~~~。

 

まとめ

なんかグダグダでしたが、取り敢えず

1.新しいカラム定義を持ったtableをcreateする

2.insert into [table] select * from [table]; などでデータを全部同じ並びでぶっこむ

3.元のtableをdropする

4.alter table [table] rename to 名前で元のtableと同じ名前にする

こんな感じです。しつこいけど2から3に行く前に中身が移ってるか確認したほうがいいかも。以上。

画像が見にくいのは反省ですね...近いうちに何とかします