J'ai un tableau avec des colonnes name
, qty
, rate
. Il me faut maintenant ajouter une nouvelle colonne COLNew
entre les colonnes name
et qty
. Comment ajouter une nouvelle colonne entre deux colonnes?
Vous avez deux options. Tout d'abord, vous pouvez simplement ajouter une nouvelle colonne avec les éléments suivants:
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
Deuxièmement, et plus compliqué, mais mettre réellement la colonne où vous le souhaitez, serait renommer la table:
ALTER TABLE {tableName} RENAME TO TempOldTable;
Puis créez la nouvelle table avec la colonne manquante:
CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
Et remplissez-le avec les anciennes données:
INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
Puis supprimez l'ancienne table:
DROP TABLE TempOldTable;
Je préférerais de loin la deuxième option, car elle vous permettra de tout renommer au besoin.
Vous n'ajoutez pas de colonnes entre d'autres colonnes en SQL, vous les ajoutez simplement. Leur emplacement dépend entièrement du SGBD. Le bon endroit pour s'assurer que les colonnes sortent dans le bon ordre est lorsque vous les select
.
En d'autres termes, si vous les souhaitez dans l'ordre _{name,colnew,qty,rate}
_, vous utilisez:
_select name, colnew, qty, rate from ...
_
Avec SQLite, vous devez utiliser alter table
, par exemple:
_alter table mytable add column colnew char(50)
_
Vous pouvez ajouter une nouvelle colonne avec la requête
ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)
Mais il sera ajouté à la fin, pas entre les colonnes existantes.
SQLite a une prise en charge limitée d'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 des données existantes dans une table temporaire, supprimer l'ancienne table, créer la nouvelle table, puis copier les données à partir de la table temporaire.
Par exemple, supposons que vous ayez une table nommée "t1" avec les noms de colonnes "a" et "c" et que vous souhaitiez insérer la colonne "b" de cette table. Les étapes suivantes illustrent comment cela pourrait être fait:
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 de la manière suivante:
UPDATE t1 SET b='blah' WHERE a='key'
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 null, en entrant une valeur par défaut selon vos besoins. Comme dans votre cas, vous devez appeler la requête SELECT
et vous obtiendrez l'ordre des colonnes, comme 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'index 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
ou RENAME table
ou CREATE
, le risque de perte de données sera important si vous ne le gérez pas soigneusement, par exemple dans le cas où vos transactions se produisent alors que la batterie s'épuise.
Je faisais face au même problème et la deuxième méthode proposée dans la réponse acceptée, comme indiqué dans les commentaires, peut être problématique s’agissant des clés étrangères.
Ma solution consiste à exporter la base de données dans un fichier SQL en s'assurant que les instructions INSERT incluent des noms de colonne. Je le fais en utilisant navigateur DB pour SQLite qui a une fonctionnalité pratique pour cela. Après cela, il vous suffit de modifier l'instruction create table, d'insérer la nouvelle colonne à l'endroit souhaité et de recréer la base de données.
Comme * nix, les systèmes ne sont que des exemples de
cat db.sql | sqlite3 database.db
Je ne sais pas si cela est faisable avec de très grandes bases de données, mais cela a fonctionné dans mon cas.