SQLiteデータベーステーブルの列の名前を変更するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/805363

  •  03-07-2019
  •  | 
  •  

質問

SQLiteデータベースのいくつかのテーブルのいくつかの列の名前を変更する必要があります。 類似の質問は以前にstackoverflowで質問されましたが、それは一般にSQL向けであり、SQLiteのケースは言及されていませんでした。

ALTER TABLE のSQLiteのドキュメントから、そのようなことは不可能であることがわかりました。事<!> quot;簡単に<!> quot; (つまり、単一のALTER TABLEステートメント)。

SQLiteでこのようなことを行う一般的なSQLの方法を誰かが知っているのではないかと思っていました。

役に立ちましたか?

解決

これは 2018-09-15(3.25.0)

  

ALTER TABLEコマンドの強化:

     
      
  • RENAME COLUMN oldname TO newname table RENAME COLUMN TOを使用して、テーブル内の列の名前変更のサポートを追加します。
  •   
  • トリガーおよびビュー内の名前変更されたテーブルへの参照も更新するように、テーブル名変更機能を修正します。
  •   

RENAME COLUMN

に文書化された新しい構文があります。
  

<=>構文は、テーブルtable-nameのcolumn-nameをnew-column-nameに変更します。列名は、テーブル定義自体と、列を参照するすべてのインデックス、トリガー、ビューの両方で変更されます。列名の変更によってトリガーまたはビューのセマンティックがあいまいになる場合、<=>はエラーで失敗し、変更は適用されません。

ここに画像の説明を入力 画像ソース: https://www.sqlite.org/images /syntax/alter-table-stmt.gif

例:

CREATE TABLE tab AS VALUES(1);

SELECT * FROM tab;

ALTER TABLE tab RENAME TO tab_new;

SELECT * FROM tab_new;

db-fiddle.comデモ


Androidサポート

執筆時点では、 AndroidのAPI 27はSQLiteパッケージを使用していますバージョン3.19

Androidが使用している現在のバージョンと、この更新プログラムがSQLiteバージョン3.25.0で提供されることに基づいて、このサポートがAndroidに追加されるまで少しお待ちください(約API 33)。 / p>

そして、それでも、API 33より古いバージョンをサポートする必要がある場合、これを使用することはできません。

他のヒント

テーブルがあり、<!> quot; colb <!> quot;の名前を変更する必要があるとします。 <!> quot; col_b <!> quot;:

まず、古いテーブルの名前を変更します:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

次に、古いテーブルに基づいて、更新された列名を使用して新しいテーブルを作成します。

CREATE TABLE orig_table_name (
  col_a INT
, col_b INT
);

次に、元のテーブルの内容をコピーします。

INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;

最後に、古いテーブルをドロップします。

DROP TABLE tmp_table_name;

これらすべてをBEGIN TRANSACTION;COMMIT;でラップすることもおそらく良い考えです。

ALTER COLUMNがないことは事実ですが、列の名前の変更、NOT NULL制約の削除、またはデータ型の変更のみを行う場合は、次のコマンドセットを使用できます。

注:これらのコマンドはデータベースを破損する可能性があるため、バックアップがあることを確認してください

PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;

接続を閉じてから再度開くか、データベースをバキュームして、変更をスキーマに再ロードする必要があります。

例:

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
Error: BOOKS.publication_date may not be NULL  
sqlite> PRAGMA writable_schema = 1; 
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';  
sqlite> PRAGMA writable_schema = 0;  
sqlite> .q  

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
sqlite> .q  

参照フォロー:


プラグマwritable_schema
このプラグマがオンの場合、通常のUPDATE、INSERT、およびDELETEステートメントを使用してデータベースを変更できるSQLITE_MASTERテーブル。警告:このプラグマを誤用すると、簡単にデータベースファイルが破損する可能性があります。

代替テーブル
SQLiteは、ALTER TABLEの限定されたサブセットをサポートします。 SQLiteのALTER TABLEコマンドを使用すると、ユーザーはテーブルの名前を変更したり、既存のテーブルに新しい列を追加したりできます。列の名前を変更したり、列を削除したり、表に制約を追加または削除したりすることはできません。

ALTER TABLE SYNTAX

調べてみると、 SQLiteのDBブラウザと呼ばれるこのマルチプラットフォーム(Linux | Mac | Windows)グラフィカルツールが見つかりました。非常にユーザーフレンドリーな方法で列の名前を変更できます!

編集|テーブルの変更|テーブルを選択|フィールドを編集します。クリッククリック!出来上がり!

ただし、誰かがこれを行うためのプログラム的な方法を共有したい場合は、喜んで知りたいです!

最近、 ids、lon、lat という列を持つ points という名前のテーブルを使用して、SQLite3でそれを行う必要がありました。誤って、テーブルがインポートされたとき、緯度の値は lon 列に格納され、その逆も明らかなので、これらの列の名前を変更することは明らかです。トリックは次のとおりです。

create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;

これがあなたの役に立つことを願っています!

sqliteドキュメントの引用:

  

SQLiteは以下の限定サブセットをサポートします   他の机。 ALTER TABLEコマンド   SQLiteでは、ユーザーは   テーブルまたは新しい列を追加する   既存のテーブル。 コラムの名前を変更したり、列を削除したり、テーブルに制約を追加または削除したりすることはできません。

もちろん、できることは、新しいレイアウトSELECT * FROM old_tableで新しいテーブルを作成し、受け取った値を新しいテーブルに入力します。

まず第一に、これは私を驚かせます。列の名前を変更するには、まったく新しいテーブルを作成し、古いテーブルから新しいテーブルにデータをコピーする必要があります...

SQLite操作を行うために上陸したGUIは、ベースです。実行されたすべてのコマンドを表示する気の利いたログウィンドウがあります。 Baseを使用して列の名前を変更すると、ログウィンドウに必要なコマンドが入力されます。

ベースログウィンドウ

これらは、必要な場所に簡単にコピーして貼り付けることができます。私にとっては、それは ActiveAndroid 移行ファイルです。同様に、コピーされたデータには、タイムスタンプなどではなく、SQLiteコマンドのみが含まれているのもいい感じです。

うまくいけば、それによって一部の人の時間を節約できます。

テーブルの列を変更<!> lt; id <!> gt; <!> lt; _id <!> gt;

 String LastId = "id";

    database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
    +"("
            + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
            + PhraseContract.COLUMN_PHRASE + " text ,"
            + PhraseContract.COLUMN_ORDER  + " text ,"
            + PhraseContract.COLUMN_FROM_A_LANG + " text"
    +")"
    );
    database.execSQL("INSERT INTO " +
            PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
            " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
            " FROM " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");

前述のとおり、これを行うツールSQLite Database Browserがあります。幸いなことに、このツールは、ユーザーまたはアプリケーションによって実行されたすべての操作のログを保持します。これを一度実行してアプリケーションログを見ると、関連するコードが表示されます。クエリをコピーして、必要に応じて貼り付けます。私のために働いた。これがお役に立てば幸いです

目的の列名COLNewで新しい列を作成します。

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

古い列COLOldの内容を新しい列COLNewにコピーします。

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

注:上記の行には括弧が必要です。

公式ドキュメントから

よりシンプルで高速な手順は、ディスク上のコンテンツに影響を与えない一部の変更にオプションで使用できます。次の簡単な手順は、CHECKまたはFOREIGN KEYまたはNOT NULL制約の削除、列の名前の変更、列のデフォルト値の追加または削除または変更に適しています。

  1. トランザクションを開始します。

  2. PRAGMA schema_versionを実行して、現在のスキーマバージョン番号を確認します。この番号は、以下の手順6で必要になります。

  3. PRAGMA writable_schema = ONを使用してスキーマ編集をアクティブにします。

  4. sqlite_masterテーブルのテーブルXの定義を変更するUPDATEステートメントを実行します。UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';

    注意:このようにsqlite_masterテーブルに変更を加えると、変更に構文エラーが含まれている場合、データベースが破損して読み取り不能になります。重要なデータを含むデータベースで使用する前に、別の空のデータベースでUPDATEステートメントを慎重にテストすることをお勧めします。

  5. テーブルXへの変更が他のテーブルまたはインデックスに影響する場合、またはトリガーがスキーマ内のビューである場合は、UPDATEステートメントを実行して他のテーブルのインデックスとビューも変更します。たとえば、列の名前が変更された場合、その列を参照するすべてのFOREIGN KEY制約、トリガー、インデックス、ビューを変更する必要があります。

    注意:もう一度、このようにsqlite_masterテーブルに変更を加えると、変更にエラーが含まれている場合、データベースが破損して読み取り不能になります。重要なデータを含むデータベースで使用する前に、この手順全体を別のテストデータベースで慎重にテストするか、この手順を実行する前に重要なデータベースのバックアップコピーを作成します。

  6. PRAGMA schema_version = Xを使用してスキーマバージョン番号を増やします。Xは上記の手順2で見つかった古いスキーマバージョン番号よりも1つ大きくなります。

  7. PRAGMA writable_schema = OFFを使用してスキーマ編集を無効にします。

  8. (オプション)PRAGMA integrity_checkを実行して、スキーマの変更がデータベースに損傷を与えなかったことを確認します。

  9. 上記の手順1で開始したトランザクションをコミットします。

ピンチで行う必要があり、初期列がデフォルトで作成された場合、必要な新しい列を作成し、その列に内容をコピーし、基本的に<!> quot; abandon <!> quot;古い列(存在したままですが、使用したり更新したりしないなど)

ex:

alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically

これは列を残します(そして、デフォルトではなくNOT NULLで作成された場合、それを無視する将来の挿入は失敗する可能性があります)。それ以外の場合は、ここで説明した他の回答のいずれか、または列の名前を変更できる別のデータベースを使用してください。

ケース1:SQLite 3.25.0以降

列の名前変更をサポートしているのは、SQLiteバージョン3.25.0のみです。デバイスがこの要件を満たしている場合、状況は非常に簡単です。以下のクエリで問題を解決できます。

ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";

ケース2:SQLiteの古いバージョン

結果を得るには、少し注意が必要な別のアプローチに従う必要があります

たとえば、次のようなテーブルがある場合:

CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)

そして列の名前を変更したい場合Location

ステップ1:元のテーブルの名前を変更します:

ALTER TABLE student RENAME TO student_temp;

ステップ2:次に、正しい列名で新しいテーブルstudentを作成します:

CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)

ステップ3:元のテーブルから新しいテーブルにデータをコピーします:

INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;

注:上記のコマンドはすべて1行にする必要があります。

ステップ4:元のテーブルを削除します:

DROP TABLE student_temp;

これらの4つの手順を使用すると、SQLiteテーブルを手動で変更できます。 新しいテーブルでインデックス、ビューア、またはトリガーも再作成する必要があることに注意してください。

バージョン2018-09-15(3.25.0)以降 sqliteは列の名前変更をサポートしています

https://sqlite.org/changes.html

sqlite3 yourdb .dump <!> gt; /tmp/db.txt
/tmp/db.txtを編集して、作成行の列名を変更します
sqlite2 yourdb2 <!> lt; /tmp/db.txt
mv / move yourdb2 yourdb

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top