web-dev-qa-db-fra.com

Colonne de modification SQLite

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. D'après mes recherches, j'ai découvert que pour ce faire, je dois faire ce qui suit.

  • Créer une nouvelle table avec un nouveau schéma
  • Copiez les données de l'ancienne table vers la nouvelle table
  • Supprimer l'ancienne table
  • Renommer une nouvelle table en ancien nom de table

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

43
Nathan

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

edit: Suppression du bit qui mentionnait qu'il pourrait être pris en charge dans une future version car la page a été mise à jour pour indiquer que ce n'est plus le cas

42
Daniel DiPaolo

Si la modification n'est pas trop importante (par exemple, changez 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 la réimporter à nouveau:

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

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

cat test.dump | sqlite3 new-test.db
22
Davide Vernizzi

Comme dit ici , ce type de fonctionnalités n'est pas implémenté par SQLite.

En remarque, vous pouvez faire vos deux premières étapes avec une table de création avec select:

CREATE TABLE tmp_table AS SELECT id, name FROM src_table

Lorsque j'ai exécuté "CREATE TABLE tmp_table AS SELECT id, name FROM src_table", j'ai perdu toute la mise en forme du type de colonne (par exemple, le champ horaire est devenu un champ entier

Comme indiqué initialement, cela devrait être plus facile, mais voici ce que j'ai fait pour y remédier. J'ai eu ce problème car je voulais changer le champ Not Null dans une colonne et Sqlite n'y aide pas vraiment.

Utilisation du navigateur du module complémentaire Firefox "SQLite Manager" (utilisez ce que vous aimez). J'ai créé la nouvelle table en copiant l'ancienne instruction create, j'ai fait ma modification et l'ai exécutée. Ensuite, pour obtenir les données copiées, j'ai juste mis en surbrillance les lignes, R-cliquez sur 'Copier les lignes en tant que SQL', remplacé "someTable" par mon nom de table et exécuté le SQL.

1
rich