2012-04-14 41 views
5

'int'カラムを持つテーブルがあります。ソフトウェアのアップグレード中に、私はそれを '長い'データ型に変更したいと思います。 SQLiteは、列のプロパティを変更/変更するためのオプションを(alter文で)提供していないようです。アップグレードを行いたいので、テーブルにはユーザーが失ってはならないデータが含まれている可能性があります。ですから、データの損失なしにカラムのデータ型プロパティを変更する良い方法を提案してください。(SQLite)カラムのデータ型を変更するには、良い方法が必要です

検索リンクに示唆される1つの方法は、一時テーブルを作成し、既存のテーブルからレコードをコピーし、既存のテーブルを削除して、一時テーブルの名前を変更することです。私はそれが効率的であるとは思わない。

あなたのお役に立ちました!

あなたが値をコピーし、新しいcolumを追加することができますよろしく

のVivek Ragunathan

答えて

10

次のステートメントを使用して列のタイプを変更しました。

CREATE TABLE IF NOT EXISTS **TEMP_TABLE** (id integer primary key autoincrement, **col2change integer not null**, ...) 

INSERT INTO TEMP_TABLE SELECT * FROM EXISTING_TABLE 

DROP TABLE EXISTING_TABLE 

ALTER TABLE TEMP_TABLE RENAME TO EXISTING_TABLE 

既存のテーブルのint型列を整数型に変更しました。数百行の場合、それはかなり速かった。

+0

簡単で安全な方法 – prashantwosti

0

は、古い列を削除し、新しい列に古いを形成し、その後

+0

SQLiteのドキュメントを参照する上記のコメントの1つを参照してください。列の名前を変更したり削除したりすることはできません。 –

+0

テーブルの名前を変更するのは可能でしょうか?あなたは完全な新しいテーブルを作成し、データを転送することができます –

+0

そうです。それが私の質問です。それは効率的ですか?列データ型の変更を実現する別の方法がありますか? –

0
古い名前に新しい列の名前を変更します

AFAIK Androidでテーブルを作成して使用すると列データ型を変更する方法があります。練習方法は、新しいテーブルを作成し、読み取ったデータをコピーすることです。

+0

私はそれが本当であると思います、そして私はそれを試しています! –

3

SQLite3カラムにはデータタイプがありません。affinities - カラムタイプをintからlongに変更することは効果がありません。

ラッパープログラムがSQLite3に与える前に値を切り捨てている場合は、スキーマを編集してこれを修正する方法があります。危険な操作なので、データベースをバックアップした後にのみ実行してください。スキーマはテーブルsqlite_masterに格納されます。通常は読み取り専用ですが、writable_schemaプラグマで有効にした場合は変更できます。データを無効にしない変更のみを行うように注意してください。 intlong intに変更することができます。どちらもINTEGERアフィニティを持っているためです。 SQLiteのドキュメントから

+1

しかし、列に保持されている値はintまたはlongに敏感です。長すぎない場合、列に挿入されたデータは切り捨てられます。 –

+0

その場合、SQLite3自体ではなく、値を切り捨てるラッパーAPIです。私の答えの補遺を見てください。 –

+0

getLongを使用していますか?http://developer.android.com/reference/android/database/Cursor.html#getLong(int)? –

1

列の名前を変更列を削除、または追加したり、 テーブルから制約を削除することはできません。

Check this link

その列のデータ型は、SQLiteのでは剛性ではありません覚えてください。 Check this link

編集:別の答えにあなたのコメントに続いて が、私はあなたが言及したオプションを推測する - 一時テーブルを介して作業は - オフコースは効率的ではないだけ、です。

+0

2番目のリンクが機能しません! –

+0

私の悪い、ちょうど修正されました。 – ABH

関連する問題