2020年11月18日水曜日

SQLite 3 legacy_alter_tableとは?

概要

SQLite3 のバージョン3.25.2で追加された機能。 テーブル名を変更する「alter table ~ rename ~ to ~ 」に影響する設定。 デフォルトはOFFになっていて、基本的にONにする必要はない。

バージョン3.25以降では、テーブル名を変更するとそれを参照しているビュー、トリガー、外部キーも自動的に変更される。

legacy_alter_table=ON にすると、 テーブル名を変更してもそれを参照しているビュー、トリガー、外部キーは変更されない。 バージョン3.24以前ではこの仕様だったため、互換性を保つためにこの設定がある。

環境

  • Windows 10 64bit
  • SQLite3 (3.33.0) Command-Line Shell

legacy_alter_table=OFFの場合

実行例

サンプルテーブルとそれを利用したビュー


sqlite> -- # 1.
sqlite> .tables
product     total_view

sqlite> -- # 2.
sqlite> .schema total_view
CREATE VIEW total_view
as
select
    sum(quantity)
from
    product
/* total_view("sum(quantity)") */;

sqlite> -- # 3.
sqlite> pragma legacy_alter_table;
0

sqlite> -- # 4.
sqlite> alter table product rename to item;

sqlite> -- # 5.
sqlite> .tables
item        total_view

sqlite> -- # 6.
sqlite> .schema total_view
CREATE VIEW total_view
as
select
    sum(quantity)
from
    "item"
/* total_view("sum(quantity)") */;
                    
  1. 「product」と「total_view」がある。
  2. 「total_view」ビューのスキーマ。 「product」テーブルを参照していることが確認できる。
  3. 「legacy_alter_table」の値を確認。 0(OFF)となっていることが確認できる。
  4. 「alter table ~」で「product」テーブルの名前を「item」に変更。
  5. 「product」テーブルが変更され「item」になっていることが確認できる。
  6. 「total_view」ビューのスキーマ。 こちらの参照先テーブルも「item」に変更されている。

legacy_alter_table=ONの場合

実行例

サンプルテーブルとそれを利用したビュー


sqlite> -- # 1.
sqlite> .tables
product     total_view

sqlite> -- # 2.
sqlite> .schema total_view
CREATE VIEW total_view
as
select
    sum(quantity)
from
    "product"
/* total_view("sum(quantity)") */;

sqlite> -- # 3.
sqlite> pragma legacy_alter_table=ON;
sqlite> pragma legacy_alter_table;
1

sqlite> -- # 4.
sqlite> alter table product rename to item;

sqlite> -- # 5.
sqlite> .tables
item        total_view

sqlite> -- # 6.
sqlite> .schema total_view
CREATE VIEW total_view
as
select
    sum(quantity)
from
    "product";
                    
  1. 「product」と「total_view」がある
  2. 「total_view」ビューのスキーマ。 「product」テーブルを参照していることが確認できる。
  3. 「legacy_alter_table」の値をONにする。 1(ON)となっていることが確認できる。
  4. 「alter table ~」で「product」テーブルの名前を「item」に変更。
  5. 「product」テーブルが変更され「item」になっていることが確認できる。
  6. 「total_view」ビューのスキーマ。 参照先は「product」のままで変更されていない。

参考URL