Réponses:
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 placerait la colonne où vous le souhaitez, ce serait renommer la table:
ALTER TABLE {tableName} RENAME TO TempOldTable;
Créez ensuite 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;
Supprimez ensuite l'ancienne table:
DROP TABLE TempOldTable;
Je préférerais de loin la deuxième option, car elle vous permettra de tout renommer complètement si besoin est.
PRAGMA foreign_keys = ON;
(voir sqlite.org/foreignkeys.html#fk_enable )
Vous n'ajoutez pas de colonnes entre d' autres colonnes dans SQL, vous les ajoutez simplement. Leur emplacement dépend entièrement du SGBD. Le bon endroit pour vous assurer que les colonnes sortent dans le bon ordre est quand vous select
les.
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
, un exemple étant:
alter table mytable add column colnew char(50)
SELECT * FROM mytable
?
select *
. C'est parfois pratique pour les programmes qui veulent faire la découverte de tables mais, pour la grande majorité des utilisations, vous devez spécifier explicitement ce que vous voulez et donc l'ordre dans lequel vous le voulez.
SQLite a une prise en charge ALTER TABLE limitée 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 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 comme ceci:
UPDATE t1 SET b='blah' WHERE a='key'
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 êtreINSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};
Cette mise à jour est requise pour gérer la valeur nulle, en saisissant une valeur par défaut selon vos besoins. Comme dans votre cas, vous devez appeler la SELECT
requête et vous obtiendrez l'ordre des colonnes, comme l' a déjà dit paxdiablo :
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));
donc si l'index change, votre application ne rencontrera aucun problème.
C'est le moyen sûr dans le sens où sinon, si vous utilisez CREATE temptable
ou RENAME table
ou CREATE
, il y aurait un risque élevé de perte de données si elles n'étaient pas traitées avec soin, par exemple dans le cas où vos transactions se produisent alors que la batterie est épuisée.
J'étais confronté 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 lorsqu'il s'agit de clés étrangères.
Ma solution consiste à exporter la base de données dans un fichier sql en m'assurant que les instructions INSERT incluent les noms de colonne. Je le fais en utilisant DB Browser pour SQLite qui a une fonctionnalité pratique pour cela. Après cela, il vous suffit de modifier l'instruction create table et d'insérer la nouvelle colonne où vous le souhaitez et de recréer la base de données.
Dans les systèmes de type * nix, c'est juste quelque chose
cat db.sql | sqlite3 database.db
Je ne sais pas dans quelle mesure cela est possible avec de très grandes bases de données, mais cela a fonctionné dans mon cas.