web-dev-qa-db-ja.com

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

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

ALTER TABLE のSQLiteのドキュメントから、そのようなことを「簡単に」(つまり、単一のALTER TABLEステートメント)することは不可能であることがわかります。

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

273
joce

これは 2018-09-15(3.25.0) で修正されました

ALTER TABLEコマンドの機能強化:

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

ALTER TABLE の下に文書化された新しい構文を見つけることができます

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

enter image description here 画像ソース: 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 demo


Androidサポート

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

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

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

36
Lukasz Szozda

テーブルがあり、「colb」の名前を「col_b」に変更する必要があるとします。

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

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;でラップすることもおそらく良い考えです。

433
Evan

掘り下げてみると、このマルチプラットフォーム(Linux | Mac | Windows)グラフィカルツール SQLiteのDBブラウザー が見つかりました。

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

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

53
joce

最近、SQLite3でpointsという名前のテーブルと、列id、lon、latを使用する必要がありました。誤って、テーブルがインポートされたときに、緯度の値が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;

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

18
aizquier

sqlite documentation の引用:

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

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

12

最初に、これは驚いたことに顔を叩くものの1つです:列の名前を変更するには、完全に新しいテーブルを作成し、古いテーブルから新しいテーブルにデータをコピーする必要があります。 ..

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

Base log window

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

うまくいけば、一部の人の時間を節約できます。

7
Joshua Pinter

テーブルの列<id>を<_id>に変更します

 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");
3
Vahe Gharibyan

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

2
Chris Lytridis

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

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

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

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

注:上記の行にはブラケットが必要です。

2
Anthony Ebert

公式ドキュメントから

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

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

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

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

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

    注意:このようにsqlite_masterテーブルに変更を加えると、変更に構文エラーが含まれている場合、データベースが破損して読み取り不能になります。重要なデータを含むデータベースでUPDATEステートメントを使用する前に、別の空のデータベースで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で開始したトランザクションをコミットします。

2
Mohammad Yahia

ピンチで行う必要があり、初期列がデフォルトで作成された場合、必要な新しい列を作成し、その列に内容をコピーし、基本的に古い列を「破棄」するというオプションがあります存在するが、あなたはそれを使用/更新しないなど)

例:

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
rogerdpack

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

https://sqlite.org/changes.html

0
RusAlex

ケース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テーブルを手動で変更できます。また、新しいテーブルでインデックス、ビューア、またはトリガーを再作成する必要があることにも留意してください。

0
Febin Mathew