概要
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)") */;
- 「product」と「total_view」がある。
- 「total_view」ビューのスキーマ。 「product」テーブルを参照していることが確認できる。
- 「legacy_alter_table」の値を確認。 0(OFF)となっていることが確認できる。
- 「alter table ~」で「product」テーブルの名前を「item」に変更。
- 「product」テーブルが変更され「item」になっていることが確認できる。
- 「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";
- 「product」と「total_view」がある
- 「total_view」ビューのスキーマ。 「product」テーブルを参照していることが確認できる。
- 「legacy_alter_table」の値をONにする。 1(ON)となっていることが確認できる。
- 「alter table ~」で「product」テーブルの名前を「item」に変更。
- 「product」テーブルが変更され「item」になっていることが確認できる。
- 「total_view」ビューのスキーマ。 参照先は「product」のままで変更されていない。
参考URL
-
2. ALTER TABLE RENAME
公式のalter table ~ rename ~ to に関するドキュメント
https://sqlite.org/lang_altertable.html#altertabrename -
Pragma legacy_alter_table
公式の legacy_alter_table に関するドキュメント
https://www.sqlite.org/pragma.html#pragma_legacy_alter_table