Comment renommer une colonne dans une table de base de données SQLite?
je devrais renommer quelques colonnes dans certaines tables dans une base de données SQLite. Je sais qu'une question similaire a déjà été posée sur stackoverflow, mais c'était pour SQL en général, et le cas de SQLite n'a pas été mentionné.
de la documentation de SQLite pour ALTER TABLE , je comprends qu'il n'est pas possible de faire une telle chose" facilement " (c.-à-d. une seule déclaration ALTER TABLE).
j'étais se demander quelqu'un savait d'une manière générique SQL de faire une telle chose avec SQLite.
13 réponses
améliore la commande
ALTER TABLE
:
- Ajouter un support pour renommer les colonnes dans un tableau utilisant
ALTER TABLE
tableRENAME COLUMN oldname TO newname
.- fixe la fonctionnalité de renommage de table de sorte qu'elle mette également à jour les références à la table renommée dans les triggers et les vues.
Vous pouvez trouver la nouvelle syntaxe documentée sous ALTER TABLE
la syntaxe
RENAME COLUMN TO
change la colonne-Nom de la table de table-nom en Nouvelle-colonne-Nom. Le nom de la colonne est modifié à la fois dans la définition de la table elle-même et aussi dans tous les index, les triggers et les vues qui font référence à la colonne. Si le changement de nom de colonne résulterait en une ambiguïté sémantique dans un déclencheur ou une vue, alors leRENAME COLUMN
échoue avec une erreur et aucun les modifications sont appliquées.
Image source: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
dites que vous avez une table et que vous devez renommer "colb" en "col_b":
vous renommez D'abord l'ancienne table:
ALTER TABLE orig_table_name RENAME TO tmp_table_name;
crée alors la nouvelle table, basée sur l'ancienne table mais avec le nom de colonne mis à jour:
CREATE TABLE orig_table_name (
col_a INT
, col_b INT
);
copier ensuite le contenu en face de la table originale.
INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;
enfin, laissez tomber l'ancienne table.
DROP TABLE tmp_table_name;
enveloppant tout cela dans un BEGIN TRANSACTION;
et COMMIT;
est probablement une bonne idée.
bien qu'il soit vrai qu'il n'y a pas de colonne ALTER, si vous voulez seulement renommer la colonne, Supprimer la contrainte NOT NULL, ou changer le type de données, vous pouvez utiliser l'ensemble de commandes suivant:
Note: Ces commandes ont le potentiel de corrompre votre base de données, donc assurez-vous que vous avez une sauvegarde
PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;
vous aurez besoin de fermer et de rouvrir votre connexion ou d'aspirer la base de données pour recharger les changements dans schéma.
par exemple:
Y:\> sqlite3 booktest
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);
sqlite> insert into BOOKS VALUES ("NULLTEST",null);
Error: BOOKS.publication_date may not be NULL
sqlite> PRAGMA writable_schema = 1;
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
sqlite> PRAGMA writable_schema = 0;
sqlite> .q
Y:\> sqlite3 booktest
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> insert into BOOKS VALUES ("NULLTEST",null);
sqlite> .q
REFERENCES FOLLOW:
pragma writable_schema
Lorsque ce pragma est activé, les tables SQLITE_MASTER dans lesquelles la base de données peut être modifiée en utilisant des instructions de mise à jour, D'insertion et de suppression ordinaires. Attention: l'utilisation abusive de ce pragma peut facilement aboutir à un fichier de base de données corrompu.
modifier la table
SQLite supporte un sous-ensemble limité D'ALTER TABLE. La commande ALTER TABLE en 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, supprimer une colonne, ou ajouter ou supprimer des contraintes d'une table.
creuser autour, j'ai trouvé cet outil graphique multiplateforme (Linux | Mac | Windows) appelé navigateur DB pour SQLite qui permet en fait de renommer les colonnes d'une manière très conviviale!
Modifier / Modifier La Table / Sélectionner La Table / Modifier Le Champ. Cliquez sur cliquez sur! Voila!
cependant, si quelqu'un veut partager une façon programmatique de le faire, je serais heureux de savoir!
récemment j'ai dû faire cela en SQLite3 avec une table nommée points avec les colunms id, lon, lat . Par erreur, lorsque le tableau a été importé, les valeurs de latitude où stockées dans la colonne lon et vice versa, donc une solution évidente serait de renommer ces colonnes. Donc l'astuce était:
create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;
j'espère que cela vous sera utile!
citant la documentation sqlite :
SQLite prend en charge un sous-ensemble limité de ALTER TABLE. La commande ALTER TABLE en SQLite permet à l'utilisateur de renommer un tableau ou pour ajouter une nouvelle colonne à un table existante. il n'est pas possible de renommer un colum, supprimer une colonne, ou ajouter ou supprimer des contraintes d'une table.
ce que vous pouvez faire, bien sûr, est de créer un nouveau table avec la nouvelle disposition, SELECT * FROM old_table
, et remplissez la nouvelle table avec les valeurs que vous recevrez.
tout d'abord, c'est une de ces choses qui me frappe au visage avec surprise: renommer une colonne exige de créer une table entièrement nouvelle et de copier les données de l'ancienne table à la nouvelle table...
L'interface graphique sur laquelle j'ai atterri pour effectuer des opérations SQLite est Base . Il y a une fenêtre de Log qui affiche toutes les commandes qui ont été exécutées. Faire un renommage d'une colonne via la Base popule la fenêtre de log avec les commandes nécessaires:
ceux-ci peuvent alors être facilement copiés et collés où vous pourriez avoir besoin d'eux. Pour moi, c'est dans un fichier de migration ActiveAndroid . Une autre chose intéressante est que les données copiées n'incluent que les commandes SQLite, pas les horodateurs, etc.
avec un peu de chance, ça fait gagner du temps à certaines personnes.
modifier la colonne < id > en < _id >
String LastId = "id";
database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
+"("
+ PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
+ PhraseContract.COLUMN_PHRASE + " text ,"
+ PhraseContract.COLUMN_ORDER + " text ,"
+ PhraseContract.COLUMN_FROM_A_LANG + " text"
+")"
);
database.execSQL("INSERT INTO " +
PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
" SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
" FROM " + PhraseContract.TABLE_NAME + "old");
database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");
comme mentionné ci-dessus, il y a un navigateur de base de données D'outil SQLite, qui fait ceci. Lyckily, cet outil garde un journal de toutes les opérations effectuées par l'utilisateur ou l'application. En faisant cela une fois et en regardant le journal d'application, vous verrez le code impliqué. Copier la requête et coller au besoin. A travaillé pour moi. Espérons que cette aide
créer une nouvelle colonne avec le nom de colonne désiré: COLNew.
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
copier le contenu de L'ancienne colonne COLOld dans la nouvelle colonne COLNew.
INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}
Note: les crochets sont nécessaires dans la ligne ci-dessus.
de la documentation officielle
une procédure plus simple et plus rapide peut éventuellement être utilisée pour certaines modifications qui n'affectent pas le contenu du disque de quelque manière que ce soit. La procédure plus simple suivante est appropriée pour supprimer les contraintes CHECK ou clé étrangère ou pas NULL, renommer les colonnes , ou ajouter ou supprimer ou changer les valeurs par défaut sur une colonne.
-
lancer une transaction.
-
Lancez 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.
-
activer l'édition de schéma en utilisant PRAGMA writable_schema=on.
-
exécuter une instruction de mise à jour pour changer la définition de la table X dans la table sqlite_master: mettre à jour l'ensemble sqlite_master SQL.=.. Où type= 'table' et nom= '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 la déclaration de mise à jour sur une base de données vierge séparée avant de l'utiliser sur une base de données contenant des données importantes.
-
si le changement apporté au tableau X affecte également d'autres tables ou index ou les déclencheurs sont des vues dans le schéma, puis lancez des instructions de mise à jour pour modifier les index et les vues des autres tables. Par exemple, si le nom d'une colonne change, toutes les contraintes de clé étrangère, les déclencheurs, les index et les vues qui se rapportent à cette colonne doivent être modifiés.
attention: encore une fois, apporter des modifications à la table sqlite_master comme ceci rendra la base de données corrompue et illisible si la modification contient une erreur. Tester soigneusement l'ensemble de cette procédure sur une tester la base de données avant de l'utiliser sur une base de données contenant des données importantes et/ou faire des copies de sauvegarde des bases de données importantes avant d'exécuter cette procédure.
-
incrémente le numéro de version du schéma en utilisant PRAGMA schema_version=X où X est un de plus que l'ancien numéro de version du schéma trouvé à l'étape 2 ci-dessus.
-
Désactiver le schéma de montage à l'aide de PRAGMA writable_schema=OFF.
-
(optionnel) Lancez PRAGMA integrity_check pour vérifier que les modifications du schéma n'ont pas endommagé la base de données.
-
valider la transaction a commencé à l'étape 1 ci-dessus.
une option, si vous avez besoin qu'il soit fait dans un pincement, et si votre colonne initiale a été créée avec un défaut, est de créer la nouvelle colonne que vous voulez, Copiez le contenu sur elle, et fondamentalement "abandonner" l'ancienne colonne (il reste présent, mais vous ne l'utilisez pas/la mettre à jour, etc.)
ex:
alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically
cela laisse derrière une colonne( et si elle a été créée avec non nul mais sans défaut, alors inserts futurs qui l'ignorent pourrait échouer), mais si c'est juste une table de jeu, les compromis pourraient être acceptables. Sinon, utilisez l'une des autres réponses mentionnées ici, ou une autre base de données qui permet aux colonnes d'être renommés.
sqlite3 yourdb .dump > /tmp / db.txt
modifier /tmp/db.txt modifier le nom de la colonne dans Créer la ligne
sqlite2 yourdb2 < /tmp / db.txt
MV / move yourdb2 yourdb