323 votes

Comment renommer une colonne dans une table de base de données SQLite ?

J'aurais besoin de renommer quelques colonnes dans certaines tables d'une base de données SQLite. Je sais qu'un 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'était pas mentionné.

Dans la documentation de SQLite pour ALTER TABLE J'en déduis qu'il n'est pas possible de faire une telle chose "facilement" (c'est-à-dire avec une seule instruction ALTER TABLE).

Je me demandais si quelqu'un connaissait un moyen SQL générique de faire une telle chose avec SQLite.

0 votes

Vous pouvez le faire en utilisant navigateur de bases de données pour sqlite assez facilement

1 votes

Veuillez considérer de marquer cette réponse comme acceptée stackoverflow.com/a/52346199/124486

474voto

Evan Points 9261

Disons que vous avez une table et que vous devez renommer "colb" en "col_b" :

D'abord vous renommez l'ancienne table :

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

Créez ensuite 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
);

Ensuite, copiez le contenu à partir du tableau original.

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;

Envelopper tout cela dans un BEGIN TRANSACTION; y COMMIT; est aussi probablement une bonne idée.

56 votes

Et n'oubliez pas vos indices.

11 votes

Très important, le code d'exemple ci-dessus manque une transaction. Vous devriez envelopper le tout dans un BEGIN/END (ou ROLLBACK) pour vous assurer que le renommage se termine avec succès ou pas du tout.

0 votes

Comment faire face aux indicateurs ?

62voto

Joce Points 3720

En creusant un peu, j'ai trouvé cet outil graphique multiplateforme (Linux | Mac | Windows) appelé DB Browser for SQLite qui permet effectivement de renommer les colonnes de manière très conviviale !

Editer | Modifier le tableau | Sélectionner le tableau | Modifier le champ. Cliquez sur le bouton ! Voilà !

Cependant, si quelqu'un veut partager une façon programmatique de le faire, je serais heureux de le savoir !

1 votes

Il existe également un Un module complémentaire pour Firefox qui fait la même chose Cliquez avec le bouton droit de la souris sur la colonne que vous souhaitez renommer et sélectionnez "Modifier la colonne".

1 votes

Même dans openSUSE, il est disponible sous forme de paquetage : software.opensuse.org/package/sqlitebrowser

0 votes

C'est bizarre qu'il ait autant de votes. Nous parlons ici de programmation (code). Pourquoi avez-vous posté cette réponse ici ?

55voto

Noah Points 7332

S'il est vrai qu'il n'existe 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 la série de commandes suivante :

Note : Ces commandes peuvent potentiellement corrompre votre base de données, assurez-vous donc d'avoir 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 devrez soit fermer et rouvrir votre connexion, soit faire le vide dans la base de données pour recharger les modifications dans le 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  

LES RÉFÉRENCES SUIVENT :


pragma writable_schema
Lorsque ce pragme est activé, les tables SQLITE_MASTER de la base de données peuvent être modifiées à l'aide d'instructions UPDATE, INSERT et DELETE ordinaires. Avertissement : une mauvaise utilisation de ce pragme peut facilement entraîner un fichier de base de données corrompu.

modifier la table
SQLite supporte un sous-ensemble limité de ALTER TABLE. La commande ALTER TABLE de 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.

ALTER TABLE SYNTAX

3 votes

C'est dangereux, mais c'est la réponse la plus directe.

1 votes

Bien que cela soit dangereux, serait-ce la façon la plus performante de renommer une colonne (mieux que de créer une nouvelle table, de copier les données et de supprimer l'ancienne table) ? En outre, est-ce vraiment si dangereux ? Elle semble sujette à des erreurs, mais sauf erreur de ma part, l'instruction UPDATE est enveloppée dans une transaction, donc elle devrait être à l'abri des pannes de courant soudaines, des exceptions hors mémoire, etc.

2 votes

Oui, extrêmement rapide Dangerous signifie seulement "Assurez-vous d'avoir une sauvegarde d'abord".

18voto

aizquier Points 158

Récemment, j'ai dû faire cela en SQLite3 avec une table nommée points avec les colombes id, lon, lat . Par erreur, lorsque la table a été importée, les valeurs de latitude ont été stockées dans le champ 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 !

0 votes

Cette méthode ne copie pas la valeur PK de manière appropriée et crée automatiquement la colonne cachée rowid. Ce n'est pas nécessairement un problème mais je voulais le signaler parce que c'est devenu un problème pour moi.

4 votes

Ne serait-il pas plus simple de faire "UPDATE points SET lon = lat, lat = lon ;"?

1 votes

Cette réponse fait le processus dans l'ORDRE correct. Créez d'abord la table temporaire et remplissez-la puis détruire l'original .

14voto

Elazar Leibovich Points 9396

En citant le documentation sqlite :

SQLite supporte 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, d'ajouter ou de supprimer des contraintes dans une table.

Ce que vous pouvez faire bien sûr, c'est créer une nouvelle table avec la nouvelle mise en page, SELECT * FROM old_table et remplissez le nouveau tableau avec les valeurs que vous recevrez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X