Как переименовать столбец в таблице базы данных SQLite?

Мне нужно переименовать несколько столбцов в некоторых таблицах в базе данных SQLite. Я знаю, что ранее вопрос qaru.site/info/17075/...

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

Мне было интересно, кто-то знал об общем способе SQL, который делает это с SQLite.

Ответ 1

Это было исправлено в 2018-09-15 (3.25.0)

Улучшена команда ALTER TABLE:

  • Добавлена поддержка переименования столбцов в таблице с использованием таблицы ALTER TABLE RENAME COLUMN oldname TO newname.
  • Исправьте функцию переименования таблицы, чтобы она также обновляла ссылки на переименованную таблицу в триггерах и представлениях.

Вы можете найти новый синтаксис, задокументированный в ALTER TABLE

Синтаксис RENAME COLUMN TO изменяет имя столбца таблицы имя таблицы на имя нового столбца. Имя столбца изменяется как в самом определении таблицы, так и во всех индексах, триггерах и представлениях, которые ссылаются на столбец. Если изменение имени столбца приведет к семантической неоднозначности в триггере или представлении, то RENAME COLUMN завершится ошибкой и изменения не будут применены.

enter image description here Источник изображения: https://www.sqlite.org/images/syntax/alter-table-stmt.gif

Пример:

CREATE TABLE tab AS VALUES(1);

SELECT * FROM tab;

ALTER TABLE tab RENAME TO tab_new;

SELECT * FROM tab_new;

Демо-версия db-fiddle.com


Поддержка Android

На момент написания, Android API 27 использует пакет SQLite версии 3.19.

Исходя из текущей версии, которую использует Android, и того, что это обновление будет выпущено в версии 3.25.0 SQLite, я бы сказал, что вам нужно немного подождать (примерно API 33), прежде чем поддержка этого будет добавлена в Android.

И даже в этом случае, если вам нужно поддерживать какие-либо версии, более старые, чем API 33, вы не сможете использовать это.

Ответ 2

Скажите, что у вас есть таблица и вам нужно переименовать "colb" в "col_b":

Сначала вы переименовываете старую таблицу:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

Затем создайте новую таблицу на основе старой таблицы, но с обновленным именем столбца:

CREATE TABLE orig_table_name (
  col_a INT
, col_b INT
);

Затем скопируйте содержимое из исходной таблицы.

INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;

Наконец, оставьте старую таблицу.

DROP TABLE tmp_table_name;

Обертка всего этого в BEGIN TRANSACTION; и COMMIT; также, вероятно, хорошая идея.

Ответ 3

Копаясь, я нашел этот многоплатформенный (Linux | Mac | Windows) графический инструмент под названием DB Browser для SQLite, который фактически позволяет переименовывать столбцы очень удобным для пользователя способом!

Редактировать | Изменить таблицу | Выберите таблицу | Изменить поле. Нажмите кнопку! Вуаля!

Однако, если кто-то хочет поделиться программным способом этого, я был бы рад узнать!

Ответ 4

Хотя верно, что нет ALTER COLUMN, если вы хотите только переименовать столбец, отбросить ограничение NOT NULL или изменить тип данных, вы можете использовать следующий набор команд:

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

PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;

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

Например:

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
Error: BOOKS.publication_date may not be NULL  
sqlite> PRAGMA writable_schema = 1; 
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';  
sqlite> PRAGMA writable_schema = 0;  
sqlite> .q  

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
sqlite> .q  

ССЫЛКИ ПОСЛЕДУЮЩИЕ:


pragma writable_schema
Когда эта прагма включена, таблицы SQLITE_MASTER, в которых база данных может быть изменена с помощью обычных операторов UPDATE, INSERT и DELETE. Предупреждение: неправильное использование этой прагмы может привести к повреждению файла базы данных.

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

ALTER TABLE SYNTAX

Ответ 5

Недавно мне пришлось сделать это в SQLite3 с таблицей с именем points с колонками id, lon, lat. Ошибочно, когда таблица была импортирована, значения для широты, где они хранятся в столбце lon и наоборот, поэтому очевидным решением было бы переименовать эти столбцы. Итак, трюк был:

create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;

Я надеюсь, что это будет полезно для вас!

Ответ 6

Цитирование документации sqlite:

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

Конечно, вы можете создать новую таблицу с новым макетом SELECT * FROM old_table и заполнить новую таблицу значениями, которые вы получите.

Ответ 7

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

Графический интерфейс, на который я применил операции SQLite, - Base. Он получил отличное окно журнала, в котором отображаются все команды, которые были выполнены. Выполнение переименования столбца через Base заполняет окно журнала необходимыми командами:

Base log window

Затем их можно легко скопировать и вставить туда, где они могут понадобиться. Для меня это в файл миграции ActiveAndroid. Приятным прикосновением также является то, что скопированные данные включают только команды SQLite, а не временные метки и т.д.

Надеюсь, это спасет людей.

Ответ 8

изменить столбец таблицы <id> to < _id >

 String LastId = "id";

    database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
    +"("
            + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
            + PhraseContract.COLUMN_PHRASE + " text ,"
            + PhraseContract.COLUMN_ORDER  + " text ,"
            + PhraseContract.COLUMN_FROM_A_LANG + " text"
    +")"
    );
    database.execSQL("INSERT INTO " +
            PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
            " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
            " FROM " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");

Ответ 9

Как упоминалось ранее, есть инструмент SQLite Database Browser, который делает это. Lyckily, этот инструмент хранит журнал всех операций, выполняемых пользователем или приложением. Сделав это один раз и просмотрев журнал приложений, вы увидите код. Скопируйте запрос и вставьте его по мере необходимости. Работал для меня. Надеюсь, что это поможет

Ответ 10

Создайте новый столбец с нужным именем столбца: COLNew.

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

Скопировать содержимое старого столбца COLOld в новый столбец COLNew.

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

Примечание: в верхней строке необходимы скобки.

Ответ 11

Из официальной документации

Более простая и быстрая процедура может быть произвольно использована для некоторых изменений, которые никак не влияют на содержимое на диске. Следующая упрощенная процедура подходит для удаления ограничений CHECK или FOREIGN KEY или NOT NULL, переименования столбцов или добавления или удаления или изменения значений по умолчанию в столбце.

  1. Запустите транзакцию.

  2. Запустите PRAGMA schema_version, чтобы определить номер версии текущей схемы. Это число потребуется для шага 6 ниже.

  3. Активируйте редактирование схемы с помощью PRAGMA writable_schema = ON.

  4. Запустите инструкцию UPDATE, чтобы изменить определение таблицы X в таблице sqlite_master: UPDATE sqlite_master SET sql =... WHERE type = 'table' AND name = 'X';

    Внимание: внесение изменений в таблицу sqlite_master, подобную этой, приведет к повреждению и нечитаемости базы данных, если изменение содержит синтаксическую ошибку. Предполагается, что тщательное тестирование инструкции UPDATE должно выполняться в отдельной пустой базе данных до ее использования в базе данных, содержащей важные данные.

  5. Если изменение таблицы X также влияет на другие таблицы или индексы, или триггеры представляют собой представления в схеме, затем запускайте инструкции UPDATE для изменения этих других таблиц и индексов. Например, если имя столбца изменяется, все ограничения FOREIGN KEY, триггеры, индексы и представления, относящиеся к этому столбцу, должны быть изменены.

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

  6. Увеличьте номер версии схемы с помощью PRAGMA schema_version = X, где X больше, чем номер версии старой схемы, найденный на шаге 2 выше.

  7. Отключить редактирование схемы с помощью PRAGMA writable_schema = OFF.

  8. (Необязательно) Запустите PRAGMA integrity_check, чтобы убедиться, что изменения схемы не повредили базу данных.

  9. Перенесите транзакцию, начатую на шаге 1 выше.

Ответ 12

Один вариант, если вам это нужно сделать, и если ваш начальный столбец был создан по умолчанию, нужно создать новый столбец, который вам нужен, скопировать содержимое на него и в основном "отказаться" от старого столбца (он остается присутствующим, но вы просто не используете/не обновляете его и т.д.)

Пример:

alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically

Это оставляет столбец (и если он был создан с NOT NULL, но без значения по умолчанию, тогда будущие вставки, которые игнорируют его, могут завершиться неудачно), но если это просто таблица с выбросом, компромиссы могут быть приемлемыми. В противном случае используйте один из других ответов, упомянутых здесь, или другую базу данных, которая позволяет переименовывать столбцы.

Ответ 13

Начиная с версии 2018-09-15 (3.25.0) sqlite поддерживает переименование столбцов

https://sqlite.org/changes.html

Ответ 14

Случай 1: SQLite 3.25. 0+

Только версия 3.25.0 SQLite поддерживает переименование столбцов. Если ваше устройство отвечает этому требованию, все довольно просто. Следующий запрос решит вашу проблему:

ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";

СЛУЧАЙ 2: Старые версии SQLite

Вы должны следовать другому подходу, чтобы получить результат, который может быть немного сложнее

Например, если у вас есть такая таблица:

CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)

И если вы хотите изменить название столбца Location

Шаг 1: переименуйте исходную таблицу:

ALTER TABLE student RENAME TO student_temp;

Шаг 2: Теперь создайте новую таблицу student с правильным именем столбца:

CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)

Шаг 3: Скопируйте данные из исходной таблицы в новую таблицу:

INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;

Примечание. Приведенная выше команда должна состоять из одной строки.

Шаг 4: Оставьте исходную таблицу:

DROP TABLE student_temp;

С помощью этих четырех шагов вы можете вручную изменить любую таблицу SQLite. Имейте в виду, что вам также нужно будет заново создать любые индексы, средства просмотра или триггеры для новой таблицы.

Ответ 15

sqlite3 yourdb.dump > /tmp/db.txt
edit/tmp/db.txt изменить имя столбца в строке Создать sqlite2 yourdb2 </tmp/db.txt
mv/move yourdb2 yourdb