2010-02-05 9 views
1

Existe-t-il un moyen simple de modifier une table dans les versions récentes de sqlite afin qu'elle corresponde à un schéma prédéfini?Table SQLite3 et Alter .. après

Schéma:

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) 

Maintenant, je veux insérer clantag VARCHAR (16) après Clanname il est compatible avec d'autres configurations.

Je ne me dérange pas l'exportation, le creusement de fossés, de recréer, mais je me demande s'il y a une possibilité de le faire sans que, compte tenu d'autres bases de données SQL peut gérer que ...

+0

Il y a probablement une erreur dans votre schéma collé: il contient déjà une colonne nommée clantag. Je suppose que c'est accidentel? – Ondergetekende

+0

Je vous suggère de passer du temps à lire la documentation SQLite. C'est assez différent des autres bases de données SQL. Votre schéma suggère que vous n'êtes pas familier avec le système de typage particulier de SQLite. – Ondergetekende

+0

Ouais c'était accidentel ... Voulait poster l'intacte au lieu de l'modifié. Et vous avez raison, je n'utilise pas beaucoup de travaux internes de sqlite lui-même car mon code est pour la plupart indépendant de la base de données et ne peut donc pas utiliser beaucoup de choses spécifiques d'un seul. – Jokey

Répondre

3

SQLite prend en charge l'ajout de colonnes, comme shown here. La seule restriction à laquelle vous serez confronté est que la colonne sera à la fin de la table, mais pour une utilisation normale, l'ordre des colonnes ne devrait pas poser de problème. Une autre solution consiste à créer une nouvelle table avec la nouvelle définition, insérez toutes vos données en elle, laissez tomber la vieille table et renommer la nouvelle table, comme ceci:

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; 
+0

C'est ce que je m'attendais à une fin :) Bon à savoir, que je n'ai pas oublié quelque chose de plus simple que cela. – Jokey

Questions connexes