SQLite Modifier La Colonne

J'ai besoin de modifier une colonne dans une base de données SQLite mais je dois le faire par programme car la base de données est déjà en production. De mes recherches, j'ai constaté que pour ce faire, je dois faire ce qui suit.

  • crée une nouvelle table avec un nouveau schéma
  • copie les données de l'ancienne table vers la nouvelle table
  • Supprimer l'ancienne table
  • Renommer la nouvelle table en anciennes tables nom

Cela semble être une quantité ridicule de travail pour quelque chose qui devrait être relativement facile. N'est-il pas un moyen plus facile? Tout ce que je dois faire est de changer une contrainte sur une colonne existante et de lui donner une valeur par défaut.

40
demandé sur Nathan 2010-04-21 23:17:22

4 réponses

C'est L'un des inconvénients les plus connus de SQLite (pas de support MODIFY COLUMN sur ALTER TABLE), mais c'est sur la liste des fonctionnalités SQL que SQLite n'implémente pas.

Edit: bit supprimé qui a mentionné qu'il peut être pris en charge dans une future version que la page a été mise à jour pour indiquer que ce n'est plus le cas

40
répondu Daniel DiPaolo 2013-10-14 16:33:35

Si la modification n'est pas trop importante (par exemple, modifier la longueur d'un varchar), vous pouvez vider la base de données, modifier manuellement la définition de la base de données et l'importer à nouveau:

echo '.dump' | sqlite3 test.db > test.dump

Ensuite, ouvrez le fichier avec un éditeur de texte, recherchez la définition que vous souhaitez modifier, puis:

cat test.dump | sqlite3 new-test.db
21
répondu Davide Vernizzi 2012-04-30 14:50:43

Comme dit ici , ce genre de fonctionnalités ne sont pas implémentées par SQLite.

Comme note de côté, vous pouvez faire vos deux premiers pas avec une table create avec select:

CREATE TABLE tmp_table AS SELECT id, name FROM src_table
8
répondu Jhonny D. Cano -Leftware- 2010-04-21 19:32:07

Lorsque j'ai lancé "CREATE TABLE TMP_TABLE AS SELECT id, name FROM src_table", j'ai perdu tout le formatage du type de colonne (par exemple, le champ de temps transformé en un champ entier

Comme indiqué initialement semble que cela devrait être plus facile, mais voici ce que j'ai fait pour réparer. J'ai eu ce problème b / C je voulais changer le champ Not Null dans une colonne et Sqlite n'aide pas vraiment là.

Utilisation du navigateur Firefox addon' SQLite Manager ' (utilisez ce que vous aimez). J'ai créé la nouvelle table en copiant l'ancienne création déclaration, a fait ma modification, et l'a exécuté. Ensuite, pour obtenir les données copiées, je viens de mettre en évidence les lignes, R-cliquez sur 'Copier la ou les lignes en tant que SQL', remplacé "someTable" par mon nom de table, et exécuté le SQL.

1
répondu rich 2011-01-11 18:23:18