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

261

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

Теги:

5 ответов

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;

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

  • 20
    Я бы выбрал первый вариант и использовал параметр по умолчанию из параметра secend. ALTER TABLE {tableName} ADD COLUMN COLNew {type} DEFAULT {defaultValue}; Более важно: (думая о том, почему вы хотите упорядочить столбцы ..) всегда используйте в каждом действии записи (например, вставка или добавление) имена столбцов, таким образом, вы никогда не получите ошибок в своем коде после изменения таблицы.
  • 4
    Кстати: значение по умолчанию не может быть добавлено в ALTER TABLE для некоторых типов полей: sqlite.org/lang_altertable.html
Показать ещё 8 комментариев
73

Вы не добавляете столбцы между другими столбцами в 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 ?
  • 0
    Какое значение по умолчанию установлено, если мы не указываем его в существующих строках нового столбца?
Показать ещё 2 комментария
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'
  • 0
    В моих тестах строка INSERT INTO t1 SELECT a,c FROM t1_backup; вызывает ошибку: "таблица t1 имеет 3 столбца, но было предоставлено 2 значения: INSERT INTO t1 SELECT a, c FROM t1_backup;". Правильная строка должна быть INSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
7

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

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

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

3
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
    Спасибо @naval это работает для меня

Ещё вопросы

Сообщество Overcoder
Наверх
Меню