382 votes

Insérer une nouvelle colonne dans une table en sqlite ?

J'ai un tableau avec des colonnes name , qty , rate . Maintenant, je dois ajouter une nouvelle colonne COLNew entre les name y qty colonnes. Comment ajouter une nouvelle colonne entre deux colonnes ?

716voto

Raceimaztion Points 2703

Vous avez deux options. Premièrement, vous pouvez simplement ajouter une nouvelle colonne avec le texte suivant :

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

La deuxième solution, plus compliquée, mais qui permet de placer la colonne là où vous le souhaitez, consiste à renommer la table :

ALTER TABLE {tableName} RENAME TO TempOldTable;

Ensuite, créez la nouvelle table avec la colonne manquante :

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);

Et le remplir avec les anciennes données :

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;

Ensuite, supprimez l'ancienne table :

DROP TABLE TempOldTable;

Je préfère de loin la deuxième option, car elle vous permettra de tout renommer complètement si nécessaire.

32 votes

J'opterais pour la première option, et j'utiliserais l'option par défaut parmi les options secondaires ALTER TABLE {nomdelatable} ADD COLUMN COLNew {type} DEFAULT {defaultValue} ; Plus important : (en pensant à la raison pour laquelle vous voulez ordonner les colonnes ) utilisez dans chaque action d'enregistrement (comme l'insertion ou l'ajout) toujours les noms des colonnes, de cette façon, vous n'aurez jamais d'erreurs quelque part dans votre code après avoir modifié la table.

6 votes

A propos : la valeur par défaut ne peut pas être ajoutée dans ALTER TABLE pour certains types de champs : sqlite.org/lang_altertable.html

10 votes

N'oubliez pas de recréer les index.

125voto

paxdiablo Points 341644

Vous n'ajoutez pas de colonnes entre d'autres colonnes en SQL, il suffit de les ajouter. L'endroit où elles sont placées dépend entièrement du SGBD. Le bon endroit pour s'assurer que les colonnes sortent dans le bon ordre est lorsque vous select les.

En d'autres termes, si vous les voulez dans l'ordre {name,colnew,qty,rate} que vous utilisez :

select name, colnew, qty, rate from ...

Avec SQLite, vous devez utiliser alter table un exemple étant :

alter table mytable add column colnew char(50)

2 votes

SELECT * FROM mytable ?

0 votes

Quelle est la valeur par défaut définie si nous ne la spécifions pas dans les lignes existantes de la nouvelle colonne ?

14 votes

Il y a très peu de cas d'utilisation où vous devriez faire select * du tout. C'est parfois pratique pour les programmes qui veulent découvrir des tableaux mais, pour la grande majorité des utilisations, vous devriez spécifier explicitement ce que vous voulez et donc l'ordre dans lequel vous le voulez.

12voto

Mudassir Points 8017

Vous pouvez ajouter une nouvelle colonne avec la requête

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

Mais elle sera ajoutée à la fin, et non entre les colonnes existantes.

10voto

CJH Points 309

SQLite a un support limité de ALTER TABLE que vous pouvez utiliser pour ajouter une colonne à la fin d'une table ou pour changer le nom d'une table.

Si vous souhaitez apporter des modifications plus complexes à la structure d'une table, vous devrez recréer la table. Vous pouvez enregistrer les données existantes dans une table temporaire, supprimer l'ancienne table, créer la nouvelle table, puis recopier les données à partir de la table temporaire.

Par exemple, supposons que vous avez une table nommée "t1" avec des colonnes nommées "a" et "c" et que vous voulez insérer la colonne "b" de cette table. Les étapes suivantes illustrent comment procéder :

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

Vous êtes maintenant prêt à insérer vos nouvelles données comme suit :

UPDATE t1 SET b='blah' WHERE a='key'

0 votes

Dans mes tests, la ligne INSERT INTO t1 SELECT a,c FROM t1_backup; provoque l'erreur : "La table t1 a 3 colonnes mais 2 valeurs ont été fournies : INSERT INTO t1 SELECT a,c FROM t1_backup ;". La ligne correcte devrait être INSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;

4voto

Naval Kishor Jha Points 605
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

Cette mise à jour est nécessaire pour gérer la valeur nulle, en saisissant une valeur par défaut selon vos besoins. Comme dans votre cas, vous devez appeler la fonction SELECT et vous obtiendrez l'ordre des colonnes, en tant que paxdiablo déjà dit :

SELECT name, colnew, qty, rate FROM{tablename}

et à mon avis, le nom de votre colonne pour obtenir la valeur du curseur :

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));

Ainsi, si l'indice change, votre application ne rencontrera aucun problème.

C'est la méthode la plus sûre dans le sens où sinon, si vous utilisez CREATE temptable o RENAME table o CREATE En effet, il existe un risque élevé de perte de données si l'on n'y prend garde, par exemple si vos transactions ont lieu alors que la batterie est épuisée.

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