name
、qty
、rate
という列を持つテーブルがあります。 COLNew
とname
の列の間に新しい列qty
を追加する必要があります。 2つの列の間に新しい列を追加する方法
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番目の方法をお勧めします。
あなたはSQLに列の間に他の列を追加するのではなく、単にそれらを追加するだけです。それらがどこに置かれるかはDBMS次第です。列が正しい順序で表示されるようにするための適切な場所は、それらをselect
にしたときです。
言い換えれば、それらを{name,colnew,qty,rate}
の順序で欲しいならば、あなたは使います:
select name, colnew, qty, rate from ...
SQLiteでは、 alter table
を使う必要があります。
alter table mytable add column colnew char(50)
クエリで新しい列を追加できます
ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)
ただし、既存の列の間ではなく、最後に追加されます。
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'
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
を使用している場合は、慎重に処理しないと、データが失われる可能性が高くなります。たとえば、バッテリ切れの間にトランザクションが発生した場合などです。 。
私は同じ問題に直面していました、そしてコメントで述べられているように、受け入れられた答えで提案された2番目の方法は外部キーを扱うとき問題になることがあります。
私の回避策は、INSERTステートメントに列名が含まれていることを確認して、データベースをSQLファイルにエクスポートすることです。 SQLite用のDBブラウザ を使用してこれを実行します。その後、create table文を編集して必要な場所に新しい列を挿入し、dbを再作成するだけです。
* nix風のシステムでは、
cat db.sql | sqlite3 database.db
非常に大きなデータベースでこれが実現可能かどうかはわかりませんが、私の場合はうまくいきました。