5

「int」列のテーブルがあります。ソフトウェアのアップグレード中に、「long」データ型に変更したいと考えています。SQLite は、列のプロパティを変更/変更するオプションを (alter ステートメントで) 提供していないようです。アップグレードしたいので、テーブルにはユーザーが失ってはならないデータが含まれている可能性があります。データを失うことなく列のデータ型のプロパティを変更する良い方法を教えてください。

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

あなたの助けに感謝します!

よろしく

ヴィヴェック・ラグナサン

4

5 に答える 5

13

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

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 型の列を整数型に変更しました。数百行の場合、かなり高速でした。

于 2012-04-16T16:17:52.320 に答える
3

SQLite3列にはデータ型がなく、アフィニティのみがあります。列タイプをintからlongに変更してもメリットはありません。

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

于 2012-04-14T17:45:19.930 に答える
1

SQLiteのドキュメントから

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

このリンクを確認してください

SQLiteでは列のデータ型は厳密ではないことに注意してください。このリンクを確認してください

編集: 別の回答に対するあなたのコメントに続いて、あなたが言及したオプション(一時テーブルを介して作業する)が唯一のオプションであり、コース外では効率的ではないと思います。

于 2012-04-14T17:47:06.343 に答える
0

新しい列を追加し、古いものから新しい列に値をコピーし、古い列を削除してから、新しい列の名前を古い名前に変更することができます

于 2012-04-14T17:44:07.070 に答える
0

AFAIKには、テーブルが作成されて使用されると、Androidで列のデータ型を変更する方法はありません。実践的な方法は、新しいテーブルを作成し、読んだデータをコピーすることです。

于 2012-04-14T17:44:18.360 に答える