J'aurais besoin de renommer quelques colonnes dans certaines tables d'une base de données SQLite. Je sais qu'une question similaire a été posée sur stackoverflow précédemment, mais c'était pour SQL en général, et le cas de SQLite n'a pas été mentionné.
D'après la documentation SQLite pour ALTER TABLE , je suppose qu'il n'est pas possible de faire une telle chose "facilement" (c'est-à-dire une seule instruction ALTER TABLE).
Je me demandais si quelqu'un connaissait une façon générique SQL de faire une telle chose avec SQLite.
sqlite
alter-table
joce
la source
la source
Réponses:
Cela vient d'être corrigé avec 2018-09-15 (3.25.0)
Vous pouvez trouver la nouvelle syntaxe documentée sous
ALTER TABLE
Source de l'image: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Exemple:
Démo db-fiddle.com
Prise en charge Android
Au moment de l'écriture, l'API d'Android 27 utilise la version 3.19 du package SQLite .
Sur la base de la version actuelle qu'Android utilise et que cette mise à jour arrive dans la version 3.25.0 de SQLite, je dirais que vous avez un peu d'attente (environ API 33) avant que la prise en charge de cela ne soit ajoutée à Android.
Et, même dans ce cas, si vous devez prendre en charge des versions antérieures à l'API 33, vous ne pourrez pas l'utiliser.
la source
database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")
. COLUM est surligné en rouge et indique TO attendu, a obtenu 'COLUMN' . Malheureusement, Android est toujours sur SQLite version 3.19, c'est pourquoi cela ne fonctionne pas pour moi.Supposons que vous ayez une table et que vous deviez renommer "colb" en "col_b":
Vous renommez d'abord l'ancienne table:
Créez ensuite la nouvelle table, basée sur l'ancienne table mais avec le nom de colonne mis à jour:
Copiez ensuite le contenu en face du tableau d'origine.
Enfin, laissez tomber l'ancienne table.
Envelopper tout cela dans un
BEGIN TRANSACTION;
etCOMMIT;
c'est aussi probablement une bonne idée.la source
.schema
commande SQLite est pratique pour afficher l'CREATE TABLE
instruction qui crée la table existante. Vous pouvez prendre sa sortie, la modifier selon vos besoins et l'exécuter pour créer la nouvelle table. Cette commande affiche également lesCREATE INDEX
commandes nécessaires pour créer les indices, qui devraient couvrir les préoccupations de Thomas. Bien sûr, assurez-vous d'exécuter cette commande avant de modifier quoi que ce soit.En fouillant, j'ai trouvé cet outil graphique multiplateforme (Linux | Mac | Windows) appelé DB Browser for SQLite qui permet en fait de renommer des colonnes d'une manière très conviviale!
Modifier | Modifier le tableau | Sélectionnez le tableau | Modifier le champ. Cliquez, cliquez! Voila!
Cependant, si quelqu'un veut partager une manière programmatique de le faire, je serais heureux de savoir!
la source
S'il est vrai qu'il n'y a pas d'ALTER COLUMN, si vous souhaitez uniquement renommer la colonne, supprimer la contrainte NOT NULL ou modifier le type de données, vous pouvez utiliser l'ensemble de commandes suivant:
Remarque: Ces commandes ont le potentiel de corrompre votre base de données, alors assurez-vous d'avoir une sauvegarde
Vous devrez soit fermer et rouvrir votre connexion, soit vider la base de données pour recharger les modifications dans le schéma.
Par exemple:
RÉFÉRENCES SUIVENT:
pragma writable_schema
Lorsque ce pragma est activé, les tables SQLITE_MASTER dans lesquelles la base de données peut être modifiée à l'aide des instructions UPDATE, INSERT et DELETE ordinaires. Attention: une mauvaise utilisation de ce pragma peut facilement entraîner un fichier de base de données corrompu.
alter table
SQLite prend en charge un sous-ensemble limité de ALTER TABLE. La commande ALTER TABLE dans SQLite permet à l'utilisateur de renommer une table ou d'ajouter une nouvelle colonne à une table existante. Il n'est pas possible de renommer une colonne, de supprimer une colonne ou d'ajouter ou de supprimer des contraintes d'une table.
la source
Récemment, j'ai dû le faire dans SQLite3 avec une table nommée points avec l' id de colunms , lon, lat . Erroneusly, lorsque la table a été importée, les valeurs de latitude étaient stockées dans la colonne lon et vice versa, donc une solution évidente serait de renommer ces colonnes. L'astuce était donc:
J'espère que cela vous sera utile!
la source
Citant la documentation sqlite :
Ce que vous pouvez bien sûr faire, c'est créer un nouveau tableau avec la nouvelle disposition
SELECT * FROM old_table
et remplir le nouveau tableau avec les valeurs que vous recevrez.la source
Tout d'abord, c'est une de ces choses qui me gifle avec surprise: renommer une colonne nécessite de créer une table entièrement nouvelle et de copier les données de l'ancienne table vers la nouvelle table ...
L'interface graphique sur laquelle j'ai atterri pour effectuer des opérations SQLite est Base . Il a une fenêtre de journal astucieuse qui montre toutes les commandes qui ont été exécutées. Le fait de renommer une colonne via Base remplit la fenêtre de journal avec les commandes nécessaires:
Ceux-ci peuvent ensuite être facilement copiés et collés là où vous en avez besoin. Pour moi, c'est dans un fichier de migration ActiveAndroid . Une bonne touche, également, est que les données copiées incluent uniquement les commandes SQLite, pas les horodatages, etc.
Espérons que cela fera gagner du temps à certaines personnes.
la source
BEGIN TRANSACTION;
etCOMMIT;
lignes, comme les poignées ActiveAndroid que par lui - même.CAS 1: SQLite 3.25.0+
Seule la version 3.25.0 de SQLite prend en charge le changement de nom des colonnes. Si votre appareil répond à cette exigence, les choses sont assez simples. La requête ci-dessous résoudrait votre problème:
CAS 2: SQLite Versions antérieures
Vous devez suivre une approche différente pour obtenir le résultat qui pourrait être un peu délicat
Par exemple, si vous avez une table comme celle-ci:
Et si vous souhaitez changer le nom de la colonne
Location
Étape 1: renommer la table d'origine:
Étape 2: Créez maintenant une nouvelle table
student
avec le nom de colonne correct:Étape 3: copiez les données de la table d'origine dans la nouvelle table:
Remarque: La commande ci-dessus doit être composée d'une seule ligne.
Étape 4: déposez la table d'origine:
Avec ces quatre étapes, vous pouvez modifier manuellement n'importe quelle table SQLite. Gardez à l'esprit que vous devrez également recréer tous les index, visualiseurs ou déclencheurs sur la nouvelle table.
la source
changer la colonne de table <id> en <_id>
la source
Créez une nouvelle colonne avec le nom de colonne souhaité: COLNew.
Copiez le contenu de l'ancienne colonne COLOld dans la nouvelle colonne COLNew.
Remarque: les parenthèses sont nécessaires dans la ligne ci-dessus.
la source
Comme mentionné précédemment, il existe un outil SQLite Database Browser, qui fait cela. Lyckily, cet outil conserve un journal de toutes les opérations effectuées par l'utilisateur ou l'application. En faisant cela une fois et en consultant le journal des applications, vous verrez le code impliqué. Copiez la requête et collez-la si nécessaire. A travaillé pour moi. J'espère que cela t'aides
la source
De la documentation officielle
Une procédure plus simple et plus rapide peut éventuellement être utilisée pour certaines modifications qui n'affectent en rien le contenu du disque. La procédure plus simple suivante est appropriée pour supprimer les contraintes CHECK ou FOREIGN KEY ou NOT NULL, renommer les colonnes ou ajouter ou supprimer ou modifier les valeurs par défaut sur une colonne.
Démarrez une transaction.
Exécutez PRAGMA schema_version pour déterminer le numéro de version du schéma actuel. Ce numéro sera nécessaire pour l'étape 6 ci-dessous.
Activez l'édition de schéma à l'aide de PRAGMA writable_schema = ON.
Exécutez une instruction UPDATE pour modifier la définition de la table X dans la table sqlite_master: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';
Attention: une modification de la table sqlite_master comme celle-ci rendra la base de données corrompue et illisible si la modification contient une erreur de syntaxe. Il est suggéré de tester soigneusement l'instruction UPDATE sur une base de données vierge distincte avant de l'utiliser sur une base de données contenant des données importantes.
Si la modification de la table X affecte également d'autres tables ou les index ou déclencheurs sont des vues dans le schéma, exécutez les instructions UPDATE pour modifier ces autres index et vues de tables également. Par exemple, si le nom d'une colonne change, toutes les contraintes, déclencheurs, index et vues FOREIGN KEY qui font référence à cette colonne doivent être modifiés.
Attention: Encore une fois, apporter des modifications à la table sqlite_master comme celle-ci rendra la base de données corrompue et illisible si la modification contient une erreur. Testez soigneusement toute cette procédure sur une base de données de test distincte avant de l'utiliser sur une base de données contenant des données importantes et / ou effectuez des copies de sauvegarde des bases de données importantes avant d'exécuter cette procédure.
Incrémentez le numéro de version de schéma à l'aide de PRAGMA schema_version = X où X est un de plus que l'ancien numéro de version de schéma trouvé à l'étape 2 ci-dessus.
Désactivez l'édition de schéma à l'aide de PRAGMA writable_schema = OFF.
(Facultatif) Exécutez PRAGMA Integrity_check pour vérifier que les modifications de schéma n'ont pas endommagé la base de données.
Validez la transaction commencée à l'étape 1 ci-dessus.
la source
Une option, si vous avez besoin de le faire à la rigueur, et si votre colonne initiale a été créée avec une valeur par défaut, est de créer la nouvelle colonne que vous voulez, de copier le contenu dessus et, fondamentalement, "d'abandonner" l'ancienne colonne (elle reste présent, mais vous ne l'utilisez pas / ne le mettez pas à jour, etc.)
ex:
Cela laisse une colonne (et si elle a été créée avec NOT NULL mais sans valeur par défaut, les insertions futures qui l'ignorent pourraient échouer), mais s'il ne s'agit que d'une table jetable, les compromis peuvent être acceptables. Sinon, utilisez l'une des autres réponses mentionnées ici ou une base de données différente qui permet de renommer les colonnes.
la source
Depuis la version 2018-09-15 (3.25.0), sqlite prend en charge le changement de nom des colonnes
https://sqlite.org/changes.html
la source
sqlite3 yourdb .dump> /tmp/db.txt
modifier /tmp/db.txt changer le nom de la colonne dans Créer une ligne
sqlite2 yourdb2 </tmp/db.txt
mv / déplacer yourdb2 yourdb
la source