Вставить новый столбец в таблицу в SQLite?

у меня есть таблица со столбцами name, qty, rate. Теперь мне нужно добавить новый столбец COLNew между name и qty столбцы. Как добавить новый столбец между двумя столбцами?

6 ответов


у вас есть два варианта. Во-первых, вы можете просто добавить новый столбец со следующим:

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

во-вторых, и более сложно, но на самом деле поставить столбец, где вы хотите, было бы переименовать таблицу:

ALTER TABLE {tableName} RENAME TO TempOldTable;

затем создайте новую таблицу с отсутствующим столбцом:

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

и заполните его старыми данными:

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

затем удалите старую таблицу:

DROP TABLE TempOldTable;

Я бы предпочел второй вариант, так как он позволит вам полностью переименовать все, если это необходимо.


вы не добавляете столбцы между другие столбцы в SQL, вы просто добавляете их. Где они находятся, полностью зависит от СУБД. Правильное место, чтобы убедиться, что столбцы выходят в правильном порядке, - это когда вы select них.

другими словами, если вы хотите их в порядке {name,colnew,qty,rate} вы используете:

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

С SQLite вам нужно использовать alter table, например:

alter table mytable add column colnew char(50)

SQLite имеет ограниченную поддержку ALTER TABLE, которую можно использовать для добавления столбца в конец таблицы или изменения имени таблицы.

Если вы хотите внести более сложные изменения в структуру таблицы,вам придется воссоздать таблицу. Вы можете сохранить существующие данные во временную таблицу, удалить старую таблицу, создать новую таблицу, а затем скопировать данные из временной таблицы.

например, предположим, что у вас есть таблица с именем " t1 "с именами столбцов" a" и "c", и что вы хотите вставить столбец" b " из этой таблицы. Следующие шаги иллюстрируют, как это можно сделать:

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;

теперь вы готовы вставить свои новые данные следующим образом:

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

вы можете добавить новый столбец с запросом

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

но он будет добавлен в конце, а не между существующими столбцами.


ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

это обновление требуется для обработки значения null, вводя значение по умолчанию, как требуется. Как и в вашем случае, вам нужно позвонить в SELECT запрос и вы получите порядок столбцов, как paxdiablo уже говорил:

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

и, на мой взгляд, ваше имя столбца, чтобы получить значение от курсора:

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

так, если индекс изменения приложение будет без проблем.

это безопасный путь в смысле в противном случае, если вы используете CREATE temptable или RENAME table или CREATE, была бы высокая вероятность потери данных, если бы не обрабатывались тщательно, например, в случае, когда ваши транзакции происходят, пока батарея разряжается.


я столкнулся с той же проблемой, и второй метод, предложенный в принятом ответе, как отмечено в комментариях, может быть проблематичным при работе с внешними ключами.

мой обходной путь-экспортировать базу данных в файл sql, убедившись, что инструкции INSERT включают имена столбцов. Я делаю это с помощью браузер БД для SQLite который имеет удобную функцию для этого. После этого вам просто нужно отредактировать инструкцию create table и вставить новый столбец туда, куда вы хотите и воссоздать БД.

In * nix like systems-это просто что-то вроде

cat db.sql | sqlite3 database.db

Я не знаю, насколько реально это с очень большими базами данных, но это сработало в моем случае.