2020年12月13日日曜日

SQLite3 ではテーブルに対してカラムの変更や削除ができない (~ver 3.34.1)

概要

SQLite ver 3.34.1 以下でテーブルスキーマ(構成)に対して行える操作は以下の3種類。

  • テーブルの名前を変更する
  • テーブルに新しいカラムを追加する
  • テーブルのカラムの名前を変更する

他のOracleやSQLServerなどのDBMSで出来る以下のようなことは出来ない。

  • テーブルのカラムを削除する
  • テーブルのカラムの型を変更する
  • テーブル間の外部キー制約を変更する
  • etc・・・

よって、テーブルスキーマを変更したい場合は、新しいテーブルを作成してそちらにデータを移す必要がある。

詳細

なぜこのような仕様なのかは公式の alter tableに関するページに記載してある。 これを読んでおくと、テーブルが変更できない理由や外部制約キーの仕様の理由がよくわかる。

ざっくり言うと、 SQLite3ではテーブルのスキーマを「sqlite_schema」というテーブルにDDLで保存している。 このメリットとして、スキーマを維持するコストが減る、 バージョン変わっても互換性を維持しやすい、ということがある。 デメリットとして、スキーマの変更が難しくなっている。

参考URL