2016-05-23 4 views
1

私はドキュメントを理解していません。誤ってDBにテーブルを落としてしまい、元のファイルが壊れてしまうのではないかと心配です。値を持つ列を追加するを参照しSQLITEASSETHELPER適切なアップグレードスクリプト

https://github.com/jgilfelt/android-sqlite-asset-helper

。次のコードは、クリエイターのgit-ハブサンプル

-- add a FullNames column to Employees 
ALTER TABLE "Employees" RENAME TO 'Employees_ME_TMP'; 

CREATE TABLE "Employees" 
(
    "EmployeeID" int NOT NULL, 
    "LastName" varchar(20) NOT NULL, 
    "FirstName" varchar(10) NOT NULL, 
    "FullName" varchar(150), 
    PRIMARY KEY ("EmployeeID") 
); 

INSERT INTO "Employees" 
(
    "EmployeeID", 
    "LastName", 
    "FirstName", 
    "FullName" 
) 
SELECT 
    "EmployeeID", 
    "LastName", 
    "FirstName", 
    "FirstName" || ' ' || "LastName" 
FROM 
    "Employees_ME_TMP"; 

DROP TABLE "Employees_ME_TMP"; 

私はこれは正しい構文になり、列にそれらの中に2つの列を追加し、束値を挿入する必要がある場合を介して提供されますか?

-- add a FullNames column and NickName to Employees 
ALTER TABLE "Employees" RENAME TO 'Employees_ME_TMP'; 

CREATE TABLE "Employees" 
(
    "EmployeeID" int NOT NULL, 
    "LastName" varchar(20) NOT NULL, 
    "FirstName" varchar(10) NOT NULL, 
    "FullName" varchar(150), 
    "NickName" varchar(150), 
    PRIMARY KEY ("EmployeeID") 
); 

    INSERT INTO Employees (FullName, NickName) 
    VALUES ('Tyler Durden','Jack') 
    WHERE rowid = 18; 

    INSERT INTO Employees (FullName, NickName) 
    VALUES ('Donnie Darko','Jake') 
    WHERE rowid = 19; 

DROP TABLE "Employees_ME_TMP"; 
+0

INSERTは、行ではなく、列を追加します。 –

+0

@CL http://www.tutorialspoint.com/sqlite/sqlite_insert_query.htmは、そうでないことを示唆します。しかし、大丈夫ですが、どうすればこの問題を "挿入または追加"して、ROWIDと正しい列名に関して適切な行にVALUESを追加できますか? –

+0

"SQLite INSERT INTO文は、データベースのテーブルに新しいデータ行を追加するために使用されます。 –

答えて

1

documentation言う:

INSERT文は...既存のテーブルに1つ以上の新しい行を作成します。

新しいテーブルは空ですので、実際には行を作成する必要がありますが、その行のデータは古いテーブルから取得する必要があります。 INSERTに記載されていない他の列はそのデフォルト値(この場合はNULL)で埋められます

INSERT INTO Employees(EmployeeID, LastName, FirstName) 
SELECT EmployeeID, LastName, FirstName FROM Employees_ME_TMP; 

:だから、INSERT文のSELECTフォームを使用する必要があります。 新しい値をそれらの列に配置する必要があります。 変更行はUPDATE statementで行われます

UPDATE Employees 
SET FullName = 'Tyler Durden', 
    NickName = 'Jack' 
WHERE EmployeeID = 18; 

UPDATE Employees 
SET FullName = 'Donnie Darko', 
    NickName = 'Jake' 
WHERE EmployeeID = 19; 
+0

これはなぜ必要なのか分かりますか?(ALTER TABLE "Employees" RENAME TO 'Employees_ME_TMP';) * 2つの列を更新するだけで、テーブル全体をもう一度記入する必要はなく、* **(ALTER TABLE従業員は列名 "FullName" TEXT)**、*を追加できませんでしたか? –

+0

SQLiteのALTER TABLEはかなり限定されているため、SQLiteAssetHelperはすべての場合に機能するメカニズムを示しています。 ALTER TABLEが機能するときは、それを使うことができます。 –