Мне нужно было бы переименовать несколько столбцов в некоторых таблицах в базе данных SQLite. Я знаю, что подобный вопрос был задан ранее для stackoverflow, но он был для SQL в целом, и случай SQLite не упоминался.
Из документации SQLite для ALTER TABLE я понял, что невозможно сделать такую вещь "легко" (то есть, с помощью одного оператора ALTER TABLE).
Мне было интересно, кто-то знал об общем способе SQL сделать такое с SQLite.
sqlite
alter-table
Джос
источник
источник
Ответы:
Это было исправлено в 2018-09-15 (3.25.0)
Вы можете найти новый синтаксис, документированный в
ALTER TABLE
Источник изображения: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Пример:
Демоверсия db-fiddle.com
Поддержка Android
На момент написания, Android 27 API использует пакет SQLite версии 3.19 .
Исходя из текущей версии, которую использует Android, и того, что это обновление будет выпущено в версии 3.25.0 SQLite, я бы сказал, что вам нужно немного подождать (примерно API 33), прежде чем поддержка этого будет добавлена в Android.
И даже в этом случае, если вам нужно поддерживать какие-либо версии, более старые, чем API 33, вы не сможете использовать это.
источник
database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")
, COLUM выделен красным и говорит, что ожидаемый, получил «COLUMN» . К сожалению, Android все еще работает на SQLite версии 3.19, поэтому у меня это не работает.Допустим, у вас есть таблица, и вам нужно переименовать «colb» в «col_b»:
Сначала вы переименовываете старую таблицу:
Затем создайте новую таблицу на основе старой таблицы, но с обновленным именем столбца:
Затем скопируйте содержимое напротив исходной таблицы.
Наконец, бросьте старый стол.
Заворачивать все это в
BEGIN TRANSACTION;
иCOMMIT;
тоже, наверное, хорошая идея.источник
.schema
Команда SQLite удобна для показаCREATE TABLE
оператора, который составляет существующую таблицу. Вы можете взять его выходные данные, изменить по мере необходимости и выполнить его для создания новой таблицы. Эта команда также показывает необходимыеCREATE INDEX
команды для создания индексов, которые должны охватывать проблемы Томаса. Конечно, обязательно запустите эту команду, прежде чем что-либо менять.Покопавшись, я нашел этот мультиплатформенный (Linux | Mac | Windows) графический инструмент под названием DB Browser for SQLite, который на самом деле позволяет переименовывать столбцы очень удобным для пользователя способом!
Редактировать | Изменить таблицу | Выберите таблицу | Редактировать поле. Нажмите, нажмите! Вуаля!
Однако, если кто-то хочет поделиться программным способом сделать это, я был бы рад узнать!
источник
Хотя верно то, что ALTER COLUMN отсутствует, если вы хотите переименовать только столбец, удалить ограничение NOT NULL или изменить тип данных, вы можете использовать следующий набор команд:
Примечание. Эти команды могут повредить вашу базу данных, поэтому убедитесь, что у вас есть резервная копия
Вам нужно будет либо закрыть и снова открыть свое соединение, либо очистить базу данных, чтобы перезагрузить изменения в схему.
Например:
Ссылки следуют:
pragma writable_schema
Когда эта прагма включена, таблицы SQLITE_MASTER, в которых база данных может быть изменена с помощью обычных операторов UPDATE, INSERT и DELETE. Предупреждение: неправильное использование этой прагмы может легко привести к повреждению файла базы данных.
Таблица изменения
SQLite поддерживает ограниченное подмножество ALTER TABLE. Команда ALTER TABLE в SQLite позволяет пользователю переименовать таблицу или добавить новый столбец в существующую таблицу. Невозможно переименовать столбец, удалить столбец или добавить или удалить ограничения из таблицы.
источник
Недавно мне пришлось сделать это в SQLite3 с таблицей с именем points с столбцами id, lon, lat . Ошибочно, когда таблица была импортирована, значения широты хранятся в столбце lon и наоборот, поэтому очевидным решением будет переименование этих столбцов. Итак, фокус был:
Я надеюсь, что это будет полезно для вас!
источник
Цитирование документации sqlite :
Конечно, вы можете создать новую таблицу с новым макетом
SELECT * FROM old_table
и заполнить новую таблицу значениями, которые вы получите.источник
Во-первых, это одна из тех вещей, которая удивляет меня: переименование столбца требует создания совершенно новой таблицы и копирования данных из старой таблицы в новую таблицу ...
GUI, к которому я подключился для выполнения операций SQLite, - это Base . У него есть отличное окно журнала, которое показывает все команды, которые были выполнены. Выполнение переименования столбца через Base заполняет окно журнала необходимыми командами:
Затем их можно легко скопировать и вставить там, где они могут вам понадобиться. Для меня это в файле миграции ActiveAndroid . Приятно также то, что скопированные данные содержат только команды SQLite, а не временные метки и т. Д.
Надеюсь, это экономит время некоторых людей.
источник
BEGIN TRANSACTION;
иCOMMIT;
линии, а ActiveAndroid ручки , что сам по себе.СЛУЧАЙ 1: SQLite 3.25.0+
Только версия 3.25.0 SQLite поддерживает переименование столбцов. Если ваше устройство отвечает этому требованию, все довольно просто. Следующий запрос решит вашу проблему:
СЛУЧАЙ 2: Старые версии SQLite
Вы должны следовать другому подходу, чтобы получить результат, который может быть немного хитрым
Например, если у вас есть такая таблица:
И если вы хотите изменить название столбца
Location
Шаг 1: переименуйте исходную таблицу:
Шаг 2: Теперь создайте новую таблицу
student
с правильным именем столбца:Шаг 3: Скопируйте данные из исходной таблицы в новую таблицу:
Примечание. Приведенная выше команда должна состоять из одной строки.
Шаг 4: отбросьте оригинальную таблицу:
С помощью этих четырех шагов вы можете вручную изменить любую таблицу SQLite. Имейте в виду, что вам также нужно будет заново создать любые индексы, средства просмотра или триггеры для новой таблицы.
источник
изменить столбец таблицы <id> на <_id>
источник
Создайте новый столбец с нужным именем столбца: COLNew.
Скопируйте содержимое старого столбца COLOld в новый столбец COLNew.
Примечание: скобки необходимы в строке выше.
источник
Как упоминалось ранее, есть инструмент SQLite Database Browser, который делает это. К счастью, этот инструмент ведет журнал всех операций, выполненных пользователем или приложением. Сделав это один раз и просмотрев журнал приложения, вы увидите соответствующий код. Скопируйте запрос и вставьте по мере необходимости. Работал на меня. Надеюсь это поможет
источник
Из официальной документации
При некоторых изменениях можно использовать более простую и быструю процедуру, которая никак не влияет на содержимое на диске. Следующая более простая процедура подходит для удаления ограничений CHECK или FOREIGN KEY или NOT NULL, переименования столбцов или добавления, удаления или изменения значений по умолчанию для столбца.
Начать транзакцию.
Запустите PRAGMA schema_version, чтобы определить номер текущей версии схемы. Этот номер понадобится для шага 6 ниже.
Активируйте редактирование схемы, используя PRAGMA writable_schema = ON.
Запустите оператор UPDATE, чтобы изменить определение таблицы X в таблице sqlite_master: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';
Предостережение. Внесение изменений в таблицу sqlite_master, как это, сделает базу данных поврежденной и нечитаемой, если изменение содержит синтаксическую ошибку. Рекомендуется провести тщательное тестирование оператора UPDATE в отдельной пустой базе данных, прежде чем использовать его в базе данных, содержащей важные данные.
Если изменение таблицы X также влияет на другие таблицы или индексы, или триггеры являются представлениями в схеме, запустите операторы UPDATE, чтобы изменить эти индексы и представления этих других таблиц. Например, если имя столбца изменяется, все ограничения, триггеры, индексы и представления FOREIGN KEY, которые ссылаются на этот столбец, должны быть изменены.
Внимание: еще раз внесение изменений в таблицу sqlite_master, как это сделает базу данных поврежденной и нечитаемой, если изменение содержит ошибку. Тщательно протестируйте всю эту процедуру в отдельной тестовой базе данных, прежде чем использовать ее в базе данных, содержащей важные данные, и / или сделайте резервные копии важных баз данных, прежде чем выполнять эту процедуру.
Увеличьте номер версии схемы с помощью PRAGMA schema_version = X, где X на единицу больше номера версии старой схемы, найденного на шаге 2 выше.
Отключите редактирование схемы, используя PRAGMA writable_schema = OFF.
(Необязательно) Запустите PRAGMA unity_check, чтобы убедиться, что изменения схемы не повредили базу данных.
Подтвердите транзакцию, начатую на шаге 1 выше.
источник
Один из вариантов, если вам нужно сделать это в крайнем случае, и если ваш исходный столбец был создан по умолчанию, - это создать новый столбец, который вы хотите, скопировать содержимое в него и в основном «отказаться» от старого столбца (он остается присутствует, но вы просто не используете / не обновляете его и т. д.)
например:
Это оставляет столбец (и если он был создан с NOT NULL, но без значения по умолчанию, то будущие вставки, которые игнорируют его, могут потерпеть неудачу), но если это просто одноразовая таблица, компромиссы могут быть приемлемыми. В противном случае используйте один из других упомянутых здесь ответов или другую базу данных, которая позволяет переименовывать столбцы.
источник
Начиная с версии 2018-09-15 (3.25.0) sqlite поддерживает переименование столбцов
https://sqlite.org/changes.html
источник
sqlite3 yourdb .dump> /tmp/db.txt
edit /tmp/db.txt изменить имя столбца в строке «Создать»
sqlite2 yourdb2 </tmp/db.txt
mv / move yourdb2 yourdb
источник