1

事前定義されたスキーマと一致するように、最近の sqlite バージョンでテーブルを変更する簡単な方法はありますか?

スキーマ:

war_id INTEGER NOT NULL, 
clanname VARCHAR(64), 
clanhomepage VARCHAR(128), 
date DATETIME, 
server VARCHAR(64), 
warmode_id INTEGER, 
squad_id INTEGER, 
notes TEXT, clantag String(16), 
PRIMARY KEY (war_id), 
FOREIGN KEY(warmode_id) REFERENCES warmodes (warmode_id), 
FOREIGN KEY(squad_id) REFERENCES squads (squad_id), 
FOREIGN KEY(orgamember_id) REFERENCES users (user_id)

ここで、clanname の後に clantag VARCHAR(16) を挿入して、他の設定と一致させたいと考えています。

エクスポート、破棄、再作成は気にしませんが、他のSQLデータベースがそれを処理できることを考えると、それなしで行うオプションがあるかどうか疑問に思います...

4

1 に答える 1

3

ここに示すように、SQlite は列の追加をサポートしています。直面する唯一の制限は、列がテーブルの最後にあることですが、通常の使用では列の順序は問題になりません。別の解決策は、次のように、新しい定義で新しいテーブルを作成し、すべてのデータを挿入し、古いテーブルを削除して、新しいテーブルの名前を変更することです。

BEGIN TRANSACTION;
CREATE TABLE War_TMP( 
    war_id INTEGER NOT NULL, 
    clanname VARCHAR(64), 
    clantag VARCHAR(16),
    clanhomepage VARCHAR(128), 
    date DATETIME, 
    server VARCHAR(64), 
    warmode_id INTEGER, 
    squad_id INTEGER, 
    notes TEXT, 
    PRIMARY KEY (war_id), 
    FOREIGN KEY(warmode_id) REFERENCES warmodes (warmode_id), 
    FOREIGN KEY(squad_id) REFERENCES squads (squad_id), 
    FOREIGN KEY(orgamember_id) REFERENCES users (user_id)
);

INSERT INTO War_TMP() SELECT war_id, clanname, "", clanhomepage,date,server,warmode_id,squad_id,notes FROM War;
DROP TABLE War;

ALTER TABLE War_TMP RENAME TO War;

COMMIT;
于 2010-02-05T19:35:13.373 に答える