SQLite3 и Alter table .. после - PullRequest
       24

SQLite3 и Alter table .. после

1 голос
/ 05 февраля 2010

Существует ли простой способ изменить таблицу в последних версиях 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)

Теперь я хочу вставить clantag VARCHAR (16) после имени клана, так что это согласуется с другими настройками.

Я не против экспортировать, бросать, воссоздавать, но мне интересно, есть ли возможность сделать это без этого, учитывая, что другие базы данных sql могут справиться с этим ...

1 Ответ

3 голосов
/ 05 февраля 2010

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;
...