web-dev-qa-db-ja.com

SQLite変更列

SQLiteデータベースの列を変更する必要がありますが、データベースが既に運用されているため、プログラムで変更する必要があります。私の研究から、これを行うには以下を実行する必要があることがわかりました。

  • 新しいスキーマで新しいテーブルを作成する
  • 古いテーブルから新しいテーブルにデータをコピーします
  • 古いテーブルをドロップ
  • 新しいテーブルの名前を古いテーブル名に変更します

それは、比較的簡単であるべき何かのためのとんでもない量の仕事のように思えます。もっと簡単な方法はありませんか?必要なのは、既存の列の制約を変更し、デフォルト値を設定することだけです。

43
Nathan

これはSQLiteのよく知られた欠点の1つです(MODIFY COLUMNALTER TABLEがサポートされていない)、しかし SQLiteが実装しないSQL機能のリスト にあります。

編集:ページが更新されたため、将来のリリースでサポートされている可能性があることを示すビットを削除しました。

42
Daniel DiPaolo

変更が大きすぎない場合(たとえば、varcharの長さを変更する場合)、dbをダンプし、データベース定義を手動で編集し、再度インポートすることができます:

echo '.dump' | sqlite3 test.db > test.dump

次に、テキストエディターでファイルを開き、変更する定義を検索してから、次の操作を行います。

cat test.dump | sqlite3 new-test.db
22
Davide Vernizzi

here のように、これらの種類の機能はSQLiteによって実装されていません。

副次的な注意事項として、selectを使用してテーブルを作成して最初の2つのステップを作成できます。

CREATE TABLE tmp_table AS SELECT id, name FROM src_table

「CREATE TABLE tmp_table AS SELECT id、name FROM src_table」を実行すると、すべての列タイプのフォーマットが失われました(たとえば、timeフィールドが整数フィールドに変わりました)

最初に述べたように、それは簡単なはずのようですが、ここに私が修正したものがあります。私はこの問題を抱えていましたb/c列のNot Nullフィールドを変更したかったのですが、Sqliteはそこに本当に役立ちません。

「SQLite Manager」Firefoxアドオンブラウザを使用します(好きなものを使用します)。古いcreateステートメントをコピーして新しいテーブルを作成し、変更を加えて実行しました。次に、データをコピーするために、行を強調表示し、[SQLとして行をコピー]をRクリックして、「someTable」をテーブル名に置き換え、SQLを実行しました。

1
rich