Wstawić nową kolumnę do tabeli w sqlite?

Mam tabelę z kolumnami name, qty, rate. Teraz muszę dodać nową kolumnę COLNew pomiędzy kolumnami name i qty. Jak dodać nową kolumnę pomiędzy dwoma kolumnami?

 293
Author: Uwe Keim, 2010-11-23

6 answers

Masz dwie opcje. Po pierwsze, możesz po prostu dodać nową kolumnę o następującej treści:

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

Po drugie, i bardziej skomplikowane, ale faktycznie umieścić kolumnę, gdzie chcesz, byłoby zmienić nazwę tabeli:

ALTER TABLE {tableName} RENAME TO TempOldTable;

Następnie utwórz nową tabelę z brakującą kolumną:

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

I uzupełnić je starymi danymi:

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

Następnie usuń starą tabelę:

DROP TABLE TempOldTable;

Zdecydowanie wolałbym drugą opcję, ponieważ pozwoli Ci całkowicie zmienić nazwę wszystkiego, jeśli trzeba.

 582
Author: Raceimaztion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-23 07:59:41

Nie dodajesz kolumn między innymi kolumnami w SQL, po prostu je dodajesz. Gdzie są umieszczone jest całkowicie do DBMS. Właściwe miejsce, aby upewnić się, że kolumny wychodzą w odpowiedniej kolejności, jest wtedy, gdy select je.

Innymi słowy, jeśli chcesz je w kolejności {name,colnew,qty,rate}, używasz:

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

Z SQLite, musisz użyć alter table, przykład:

alter table mytable add column colnew char(50)
 87
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-23 07:53:18

SQLite posiada ograniczoną obsługę ALTER TABLE, za pomocą której można dodać kolumnę na końcu tabeli lub zmienić jej nazwę.

Jeśli chcesz dokonać bardziej złożonych zmian w strukturze tabeli, musisz ją odtworzyć. Możesz zapisać istniejące dane do tabeli tymczasowej, upuścić starą tabelę, utworzyć nową tabelę, a następnie skopiować dane z powrotem z tabeli tymczasowej.

Na przykład, załóżmy, że masz tabelę o nazwie " t1 "z nazwami kolumn" a " i " c " i że chcesz wstawić kolumnę " b " z tej tabeli. Poniższe kroki ilustrują, jak można to zrobić:

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;

Teraz jesteś gotowy, aby wstawić nowe dane w ten sposób:

UPDATE t1 SET b='blah' WHERE a='key'
 9
Author: CJH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-20 05:31:40

Możesz dodać nową kolumnę z zapytaniem

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

Ale zostanie dodany na końcu, a nie pomiędzy istniejącymi kolumnami.

 7
Author: Mudassir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 06:33:47
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

Ta aktualizacja jest wymagana do obsługi wartości null, wprowadzając domyślną wartość zgodnie z wymaganiami. Tak jak w Twoim przypadku, musisz wywołać zapytanie {[3] } , a otrzymasz kolejność kolumn, jak paxdiablo już powiedział:

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

I moim zdaniem nazwa kolumny, aby uzyskać wartość z kursora:

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

Więc jeśli indeks zmieni się, Twoja aplikacja nie będzie miała żadnych problemów.

Jest to bezpieczny sposób w tym sensie, że w przeciwnym razie, jeśli używasz CREATE temptable lub RENAME table lub CREATE, istnieje duża szansa na utratę danych, jeśli nie będą obsługiwane ostrożnie, na przykład w przypadku, gdy transakcje mają miejsce, gdy bateria się wyczerpuje.

 4
Author: Naval Kishor Jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59

Miałem do czynienia z tym samym problemem i druga metoda zaproponowana w zaakceptowanej odpowiedzi, jak zaznaczono w komentarzach, może być problematyczna w przypadku kluczy obcych.

Moje obejście polega na wyeksportowaniu bazy danych do pliku sql, upewniając się, że instrukcje INSERT zawierają nazwy kolumn. Robię to za pomocą DB Browser for SQLite, która ma do tego przydatną funkcję. Następnie wystarczy edytować instrukcję create table i wstawić nową kolumnę tam, gdzie chcesz i odtworzyć db.

In * nix like systems is just something along the lines of

cat db.sql | sqlite3 database.db

Nie wiem, jak jest to wykonalne z bardzo dużymi bazami danych, ale w moim przypadku zadziałało.

 0
Author: Hirabayashi Taro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 03:29:53