52

SQLiteデータベースの列を変更する必要がありますが、データベースがすでに実稼働中であるため、プログラムで変更する必要があります。私の調査から、これを行うには次のことをしなければならないことがわかりました。

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

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

4

5 に答える 5

47

これはSQLiteのよく知られた欠点の1つです(MODIFY COLUMNをサポートしていません)が、SQLiteが実装していないSQL機能ALTER TABLEのリストに含まれています。

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

于 2010-04-21T19:20:20.023 に答える
28

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

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

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

cat test.dump | sqlite3 new-test.db
于 2012-04-30T14:50:43.700 に答える
10

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

補足として、selectを使用してテーブルを作成することで最初の2つのステップを実行できます。

CREATE TABLE tmp_table AS SELECT id, name FROM src_table
于 2010-04-21T19:19:50.987 に答える
1

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

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

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

于 2011-01-11T18:23:18.273 に答える
0

この質問にはすでにさまざまな良い答えがありますが、この問題を詳細に説明しているsqlite.orgページALTER TABLERENAMEも参照することをお勧めします:列( | ADD| )に可能な(いくつかの)変更だけでDROPなく、他の詳細な回避策「 ALTERTABLEがSQLiteにとってこのような問題である理由」の「他の種類のテーブルスキーマの変更と背景情報の作成」セクションの操作。特に、回避策は、より複雑なテーブルを操作する際のいくつかの落とし穴を指摘し、安全に変更を加える方法を説明しています。

于 2022-01-28T20:42:13.317 に答える