web-dev-qa-db-ja.com

SQLiteのテーブルに新しい列を挿入しますか?

nameqtyrateという列を持つテーブルがあります。 COLNewnameの列の間に新しい列qtyを追加する必要があります。 2つの列の間に新しい列を追加する方法

324
Tester

2つの選択肢があります。まず、次のようにして新しい列を追加するだけです。

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

第二に、そしてもっと複雑になりますが、実際にはあなたが望む場所にカラムを配置するでしょう、テーブルの名前を変更することでしょう:

ALTER TABLE {tableName} RENAME TO TempOldTable;

次に、不足している列を含む新しいテーブルを作成します。

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);

そしてそれに古いデータを入れてください。

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;

次に古いテーブルを削除します。

DROP TABLE TempOldTable;

必要に応じてすべての名前を完全に変更できるようにするため、2番目の方法をお勧めします。

635
Raceimaztion

あなたはSQLに列の間に他の列を追加するのではなく、単にそれらを追加するだけです。それらがどこに置かれるかはDBMS次第です。列が正しい順序で表示されるようにするための適切な場所は、それらをselectにしたときです。

言い換えれば、それらを{name,colnew,qty,rate}の順序で欲しいならば、あなたは使います:

select name, colnew, qty, rate from ...

SQLiteでは、 alter table を使う必要があります。

alter table mytable add column colnew char(50)
95
paxdiablo

クエリで新しい列を追加できます

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

ただし、既存の列の間ではなく、最後に追加されます。

9
Mudassir

SQLiteではALTER TABLEのサポートが制限されています。これを使用して、テーブルの最後にカラムを追加したり、テーブルの名前を変更したりできます。

テーブルの構造をもっと複雑に変更したい場合は、テーブルを再作成する必要があります。既存のデータを一時テーブルに保存し、古いテーブルを削除し、新しいテーブルを作成してから、一時テーブルからデータをコピーインすることができます。

たとえば、列名が "a"と "c"の "t1"という名前の表があり、この表から列 "b"を挿入するとします。次の手順は、これを行う方法を示しています。

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

これで、新しいデータを挿入する準備が整いました。

UPDATE t1 SET b='blah' WHERE a='key'
9
CJH
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

この更新は、必要に応じてデフォルト値を入力して、NULL値を処理するために必要です。あなたの場合のように、あなたはSELECTクエリを呼び出す必要があります、そしてあなたは paxdiablo がすでに言ったように、あなたは列の順序を得るでしょう:

SELECT name, colnew, qty, rate FROM{tablename}

私の意見では、カーソルから値を取得するためのあなたの列名は次のとおりです。

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));

そのため、インデックスが変更されてもアプリケーションは問題に直面しません。

CREATE temptableまたはRENAME tableまたはCREATEを使用している場合は、慎重に処理しないと、データが失われる可能性が高くなります。たとえば、バッテリ切れの間にトランザクションが発生した場合などです。 。

4

私は同じ問題に直面していました、そしてコメントで述べられているように、受け入れられた答えで提案された2番目の方法は外部キーを扱うとき問題になることがあります。

私の回避策は、INSERTステートメントに列名が含まれていることを確認して、データベースをSQLファイルにエクスポートすることです。 SQLite用のDBブラウザ を使用してこれを実行します。その後、create table文を編集して必要な場所に新しい列を挿入し、dbを再作成するだけです。

* nix風のシステムでは、

cat db.sql | sqlite3 database.db

非常に大きなデータベースでこれが実現可能かどうかはわかりませんが、私の場合はうまくいきました。

2