Insérer une nouvelle colonne dans le tableau en sqlite?

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

293
demandé sur Uwe Keim 2010-11-23 10:45:36

6 réponses

vous avez deux options. Tout d'abord, vous pouvez simplement ajouter une nouvelle colonne avec ce qui suit:

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

Deuxième, et la plus située dans un endroit compliqué, mais effectivement mettre la colonne où vous souhaitez qu'il, serait de renommer la table:

ALTER TABLE {tableName} RENAME TO TempOldTable;

puis créer la nouvelle table avec la colonne manquante:

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

et le peupler avec les anciennes données:

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

supprimer L'ancien tableau:

DROP TABLE TempOldTable;

je préférerais la seconde option, car elle vous permettra de tout renommer si nécessaire.

582
répondu Raceimaztion 2010-11-23 07:59:41

vous n'ajoutez pas de colonnes entre d'autres colonnes en SQL, vous n'avez qu'à les ajouter. L'endroit où ils sont placés dépend totalement du SGBD. Le bon endroit pour s'assurer que les colonnes sortent dans le bon ordre est quand vous select eux.

en d'autres termes, si vous les voulez 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)
87
répondu paxdiablo 2010-11-23 07:53:18

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

Si vous voulez faire des modifications plus complexes dans la structure d'une table, vous devez recréer la table. Vous pouvez enregistrer des données dans une table temporaire, la chute de l'ancien tableau, créer la nouvelle table, puis copier les données 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 voulez 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;

Maintenant vous êtes prêt à insérer vos nouvelles données comme ceci:

UPDATE t1 SET b='blah' WHERE a='key'
9
répondu CJH 2012-05-20 05:31:40

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.

7
répondu Mudassir 2017-09-21 06:33:47
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 saisissant une valeur par défaut comme vous le souhaitez. 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, votre nom de 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 sera pas confrontée à des problèmes.

C'est le moyen sûr dans le sens où sinon, si vous utilisez CREATE temptable ou RENAME table ou CREATE , il y aurait une forte probabilité de perte de données si vous n'êtes pas manipulé avec soin, par exemple dans le cas où vos transactions se produisent alors que la batterie est épuisée.

4
répondu Naval Kishor Jha 2017-05-23 11:54:59

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 quand il s'agit de clés étrangères.

ma solution est d'exporter la base de données vers un fichier sql en s'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, vous avez juste à éditer la déclaration de table créer et insérer le nouveau colonne où vous le voulez et recréer le db.

sous *nix aime systèmes est juste quelque chose le long des lignes de

cat db.sql | sqlite3 database.db

Je ne sais pas si c'est faisable avec de très grandes bases de données, mais ça a marché dans mon cas.

0
répondu Hirabayashi Taro 2018-02-22 03:29:53