web-dev-qa-db-fra.com

Modifier le type d'une colonne dans sqlite3

Je suis assez nouveau dans SQLite 3 et je viens de devoir ajouter une colonne à une table existante que j'avais. J'ai fait ça en faisant: ALTER TABLE thetable ADD COLUMN category;.

Bien sûr, j'ai oublié de spécifier le type de cette colonne. La première chose que je pensais faire était de supprimer cette colonne, puis de la rajouter. Cependant, il semble que SQLite ne dispose pas d'un moyen simple de le faire, et j'aurais dû sauvegarder la table et la recréer sans la colonne.

Cela semble désordonné, et je me demandais s'il y avait juste un moyen de modifier/ajouter le type d'une colonne. J'imagine que oui, mais ma recherche n'a donné aucun résultat, étant nouveau pour SQLite, j'imagine que cela était dû à mon libellé incorrect dans la requête.

41
Jorge Israel Peña

SQLite ne prend pas en charge la suppression ou la modification des colonnes, apparemment . Mais n'oubliez pas que les types de données de colonne ne sont pas rigides dans SQLite, non plus.

Voir également:

45
Roger Pate

Si vous préférez une interface graphique, DB Browser for SQLite le fera en quelques clics.

  1. "Fichier" - "Ouvrir la base de données"
  2. Dans l'onglet "Structure de la base de données", cliquez sur le contenu de la table (pas le nom de la table), puis sur le menu "Modifier", "Modifier la table", et maintenant vous pouvez changer le type de données de n'importe quelle colonne avec un menu déroulant. J'ai changé un champ "texte" en "numérique" afin de récupérer des données dans une plage de nombres.

DB Browser for SQLite est open source et gratuit. Pour Linux, il est disponible à partir du référentiel.

10
Insilico

Il est possible en recréant la table.Son travail pour moi, veuillez suivre l'étape suivante:

  1. créer une table temporaire en utilisant comme select * de votre table
  2. déposez votre table, créez votre table en utilisant le type de colonne de modification
  3. insérez maintenant les enregistrements de la table temporaire dans votre nouvelle table
  4. déposer une table temporaire

faire toutes les étapes ci-dessus dans le thread de travail pour réduire la charge sur uithread

3
RD-07
#!/bin/bash

DB=/tmp/synapse/homeserver.db
TABLE="public_room_list_stream"
FIELD=visibility
OLD="BOOLEAN NOT NULL"
NEW="INTEGER NOT NULL"
TMP=/tmp/sqlite_$TABLE.sql

echo "### create dump"
echo ".dump '$TABLE'" | sqlite3 "$DB" >$TMP

echo "### editing the create statement"
sed -i "s|$FIELD $OLD|$FIELD $NEW|g" $TMP

read -rsp $'Press any key to continue deleting and recreating the table $TABLE ...\n' -n1 key 

echo "### rename the original to '$TABLE"_backup"'"
sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'"

echo "### delete the old indexes"
for idx in $(echo "SELECT name FROM sqlite_master WHERE type == 'index' AND tbl_name LIKE '$TABLE""%';" | sqlite3 $DB); do
  echo "DROP INDEX '$idx';" | sqlite3 $DB
done

echo "### reinserting the edited table"
cat $TMP | sqlite3 $DB
0
rubo77