panda大学習帳外伝

勝利の方程式の解き方。

メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


SQLite 3.35.0でカラムのDROPができるようになったようなので、確認してみた。

最終更新日: Sun Nov 14 11:47:48 2021 +0900

はじめに

お試しでSQLite3のCREATE文を出力するExcel VBAのマクロを書くためにいろいろと調べていたところ、

「SQLite3でもついにカラム単位でのDROPができるようになるらしい。」

という情報を入手しました。

↑の情報を入手したタイミングと前後して、自宅やさくらインターネットのVPSで運用している Fedora 34 を 35 にアップグレードするタイミングがたまたま到来したので、Fedoraのアップグレードのついでに SQLite3 のバージョンが 3.35.0 以降に更新されたことを確認の上で、カラム単位でのDROPができるかどうか確認することにしました。

スポンサーリンク

Fedora 34のSQLite3

まず、アップグレード前、すなわち Fedora 34のSQLite3でカラムのDROPを実行するとどうなるか調べてみました。

すると…

[panda@pandanote.info ~]$ sqlite3 --version
3.34.1 2021-01-20 14:10:07 10e20c0b43500cfb9bbc0eaa061c57514f715d87238f4d835880cd846b9ealt1
[panda@pandanote.info ~]$ sqlite3 pandanote.db
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite> create table sample1( item1 text, item2 text );
sqlite> alter table sample1 add column item3 integer;
sqlite> .schema sample1
CREATE TABLE sample1( item1 text, item2 text , item3 integer);
sqlite> alter table sample1 drop column item2;
Error: near "drop": syntax error
sqlite> .quit

という結果になりました。

DROP句を含めたALTER TABLEを実行しようとするとsyntax errorとなることがわかります。



Fedora 35のSQLite3

とりあえずDROP。

次に、Fedora 35へのアップグレード(アップグレード作業についての詳細はこちら)後にカラムのDROP句を含むALTER TABLE文を発行してみました。

すると…

[panda@pandanote.info ~]$ sqlite3 --version
3.36.0 2021-06-18 18:36:39 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafaalt1
(中略)
sqlite> .schema sample1
CREATE TABLE sample1( item1 text, item2 text , item3 integer);
sqlite> alter table sample1 drop column item2;
sqlite> .schema sample1
CREATE TABLE sample1( item1 text, item3 integer);
sqlite>

sample1という名前のテーブルのitem2という名前のカラムの消去を試みましたが、削除されることが確認できました。😎

ユースケースのようなもの

次に、ユースケースのようなものとして、

「Excelからデータを読み込むために作ったテーブルにデータを読み込んだ後に、テーブルのカラムのうち、1つのカラムのカラム名を変更する。」

ことを考えます。

カラムのDROPができるので、

  1. カラム名の変更後のカラムを追加(ADD)する。
  2. テーブルに対してUPDATE句を実行することで、手順1で追加したカラムに変更前のカラムに格納されているデータをコピーする。
  3. カラム名の変更前のカラムを削除(DROP)する。

ことで、上記のユースケースが実現できそうです。

ちょっと試してみます。

sample1という3つのカラム(item1, item2, item3)を持つテーブルがあったときに、item2のカラム名をitem4に変更してみます。

[panda@pandanote.info ~]$ sqlite3 pandanote.db
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite> CREATE TABLE sample1( item1 text, item2 text , item3 integer);
sqlite> .schema sample1
CREATE TABLE sample1( item1 text, item2 text , item3 integer);
sqlite> insert into sample1(item1,item2,item3) values('A','B',1),('C','D',2);
sqlite> select * from sample1;
A|B|1
C|D|2
sqlite> alter table sample1 add column item4 text;
sqlite> .schema sample1
CREATE TABLE sample1( item1 text, item2 text , item3 integer, item4 text);
sqlite> update sample1 set item4 = item2;
sqlite> select * from sample1;
A|B|1|B
C|D|2|D
sqlite> alter table sample1 drop column item2;
sqlite> select * from sample1;
A|1|B
C|2|D
sqlite> .schema sample1
CREATE TABLE sample1( item1 text, item3 integer, item4 text);

スポンサーリンク

まとめ

今まではSQLite3でテーブルの構造を変えようとするとテーブルをいったん削除して、テーブルを作り直す必要がありました。

しかし、データを一時的にせよ削除するというのは精神衛生上地味につらいので、データベース内で閉じた形で操作ができるようになることで使い勝手がかなり良くなる予感がします。

この記事は以上です。

リンク

Fedora 34から35へのupgrade | Excelの行または列からSQLite3のCREATE TABLE句のテンプレートのようなものを出力するExcel VBAのアドインを作ってみた。 | メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


スポンサーリンク