У меня есть таблица со столбцами name
, qty
, rate
. Теперь мне нужно , чтобы добавить новый столбец COLNew
в между name
и qty
столбцами. Как добавить новый столбец между двумя столбцами?
354
У вас есть два варианта. Во-первых, вы можете просто добавить новый столбец со следующим:
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;
Я бы предпочел второй вариант, так как он позволит вам полностью переименовать все, если это будет необходимо.
PRAGMA foreign_keys = ON;
(см. sqlite.org/foreignkeys.html#fk_enable )Вы не добавляете столбцы между другими столбцами в SQL, вы просто добавляете их. То, где они находятся, полностью зависит от СУБД. Правильное расположение столбцов в правильном порядке - это когда вы
select
их.Другими словами, если вы хотите, чтобы они были в порядке
{name,colnew,qty,rate}
, вы используете:С SQLite вам нужно использовать
alter table
, например:источник
SELECT * FROM mytable
?select *
вообще. Иногда это удобно для программ, которые хотят выполнять обнаружение таблиц, но для подавляющего большинства случаев вы должны явно указывать, что вы хотите, и, следовательно, порядок, в котором вы хотите.Вы можете добавить новый столбец с запросом
Но он будет добавлен в конце, а не между существующими столбцами.
источник
SQLite имеет ограниченную поддержку ALTER TABLE, которую можно использовать для добавления столбца в конец таблицы или для изменения имени таблицы.
Если вы хотите внести более сложные изменения в структуру таблицы, вам придется пересоздать таблицу. Вы можете сохранить существующие данные во временную таблицу, удалить старую таблицу, создать новую таблицу, а затем скопировать данные обратно из временной таблицы.
Например, предположим, что у вас есть таблица с именем «t1» с именами столбцов «a» и «c», и вы хотите вставить столбец «b» из этой таблицы. Следующие шаги иллюстрируют, как это можно сделать:
Теперь вы готовы вставить свои новые данные примерно так:
источник
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;
Это обновление требуется для обработки нулевого значения с вводом значения по умолчанию. Как и в вашем случае, вам нужно вызвать
SELECT
запрос, и вы получите порядок столбцов, как уже сказал paxdiablo :и на мой взгляд, имя вашего столбца, чтобы получить значение от курсора:
поэтому, если индекс изменится, ваше приложение не столкнется с какими-либо проблемами.
Это безопасный способ в том смысле, что в противном случае, если вы используете
CREATE temptable
илиRENAME table
илиCREATE
, была бы высокая вероятность потери данных, если не обрабатывать их осторожно, например, в случае, когда ваши транзакции происходят, когда батарея разряжена.источник
Я столкнулся с той же проблемой, и второй метод, предложенный в принятом ответе, как отмечено в комментариях, может быть проблематичным при работе с внешними ключами.
Мой обходной путь - экспортировать базу данных в файл sql, убедившись, что операторы INSERT содержат имена столбцов. Я делаю это, используя DB Browser для SQLite, который имеет удобную функцию для этого. После этого вам просто нужно отредактировать оператор create table и вставить новый столбец, где вы хотите, и заново создать базу данных.
В * nix-подобных системах это просто нечто вроде
Я не знаю, насколько это возможно с очень большими базами данных, но в моем случае это сработало.
источник