2010-11-23 7 views

ответ

533

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

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; 

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

78

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

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

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

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

alter table mytable add column colnew char(50) 
+2

`SELECT * FROM mytable`? – EML 2014-07-09 17:00:59

+0

Что задано по умолчанию, если мы не укажем его в существующих строках нового столбца? – Jacob 2014-12-22 10:11:34

+7

Существует очень мало случаев использования, когда вы должны делать `select *` вообще. Иногда это удобно для программ, которые хотят делать открытия таблиц, но для подавляющего большинства применений вы должны явно указывать, что вы хотите, и, следовательно, порядок, в котором вы хотите. – paxdiablo 2014-12-30 08:05:29

6

Вы можете добавить новая колонка с запросом

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25) 

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

8

У 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' 
4
ALTER TABLE {tableName} ADD COLUMN COLNew {type}; 
UPDATE {tableName} SET COLNew = {base on {type} pass value here}; 

Это обновление требуется для обработки нулевого значения, ввод значение по умолчанию, которое вам нужно. Как и в вашем случае, вы должны вызвать 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, будет высокая вероятность потери данных, если не обращаться осторожно, например, в том случае, если ваши транзакции происходят в то время как батарея разрядилась.

0

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

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

В * NIX-подобных системах просто что-то вдоль линий

cat db.sql | sqlite3 database.db 

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

Смежные вопросы