概要
SQLite ver 3.34.1 以下でテーブルスキーマ(構成)に対して行える操作は以下の3種類。
- テーブルの名前を変更する
- テーブルに新しいカラムを追加する
- テーブルのカラムの名前を変更する
他のOracleやSQLServerなどのDBMSで出来る以下のようなことは出来ない。
- テーブルのカラムを削除する
- テーブルのカラムの型を変更する
- テーブル間の外部キー制約を変更する etc・・・
よって、テーブルスキーマを変更したい場合は、新しいテーブルを作成してそちらにデータを移す必要がある。
詳細
なぜこのような仕様なのかは公式の alter tableに関するページに記載してある。 これを読んでおくと、テーブルが変更できない理由や外部制約キーの仕様の理由がよくわかる。
ざっくり言うと、 SQLite3ではテーブルのスキーマを「sqlite_schema」というテーブルにDDLで保存している。 このメリットとして、スキーマを維持するコストが減る、 バージョン変わっても互換性を維持しやすい、ということがある。 デメリットとして、スキーマの変更が難しくなっている。
参考URL
-
Why ALTER TABLE is such a problem for SQLite
公式のalter table に関するドキュメント
https://sqlite.org/lang_altertable.html#why_alter_table_is_such_a_problem_for_sqlite
-
SQLite3 テーブル名を変更する
https://sfnovicenotes.blogspot.com/2020/12/sqlite3_7.html -
SQLite3 新しいカラム(列)を追加する
https://sfnovicenotes.blogspot.com/2020/12/sqlite3_8.html -
SQLite3 列の名前を変更する
https://sfnovicenotes.blogspot.com/2020/12/sqlite3_7.html -
SQLite3 カラムを削除する
https://sfnovicenotes.blogspot.com/2020/12/sqlite3_20.html -
SQLite3 カラムの型を変更する
https://sfnovicenotes.blogspot.com/2021/01/sqlite3.html