2010-04-21 7 views
38

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

  • Создать новую таблицу с новой схемой
  • Копирование данных из старой таблицы в новую таблицу
  • Капля старый стол
  • Переименовать новую таблицу в старые таблицы имя

Это кажется смешной объем работы для чего-то, что должно быть относительно легко. Нет ли более простого способа? Все, что мне нужно сделать, это изменить ограничение на существующий столбец и присвоить ему значение по умолчанию.

+0

Возможная дубликат [изменить тип столбца в sqlite3] (http://stackoverflow.com/questions/2083543/modify-a-columns -type-in-sqlite3) – rubo77

+0

Я создал сценарий для переименования поля в таблице здесь. http://stackoverflow.com/a/41577393/1069083 – rubo77

ответ

39

Это одна из наиболее известных недостатков SQLite (без MODIFY COLUMN поддержки на ALTER TABLE), но это на list of SQL features that SQLite does not implement. не

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

7

Как сказано here, эти функции не реализованы SQLite.

В качестве примечания, вы могли бы сделать две первые шаги с созданием таблицей с выбором:

CREATE TABLE tmp_table AS SELECT id, name FROM src_table 
+3

Приятный трюк, это избавит меня от вопроса: «Как я могу изменить порядок полей в таблице?». – SIFE

+0

Единственный случай, когда сторона примечания работает (благодаря @SIFE), является переупорядочением столбцов. Для любого изменения разрешения столбца вам все равно нужно выполнить 2 шага: CREATE, INSERT. ref: https://www.sqlite.org/lang_createtable.html – epox

1

Когда я побежал «CREATE TABLE tmp_table AS SELECT ID, имя FROM src_table» , Я потерял все форматирование типа столбца (например, поле времени превратилось в целое поле

Как изначально заявлено, кажется, что это должно быть проще, но вот что я сделал, чтобы исправить. У меня была эта проблема b/c Мне хотелось для изменения поля Not Null в столбце, и Sqlite действительно не помогает там.

Использование «SQLite Manager» Firefox addon browser (используйте то, что вам нравится). Я создал новую таблицу, скопировав старый оператор create, внеся свою модификацию и выполнив ее. Затем, чтобы скопировать данные, я просто выделил строки, R-щелкните «Копировать строки (строки) в виде SQL», заменил «someTable» на мое имя таблицы и выполнил SQL.

19

Если модификация не является слишком большим (например, изменение длины VARCHAR), вы можете сбросить БД вручную изменить определение базы данных и импортировать его обратно:

echo '.dump' | sqlite3 test.db > test.dump 

затем открыть файл с текстовый редактор, поиск для определения вы хотите изменить, а затем:

cat test.dump | sqlite3 new-test.db 
+0

На моем 3BG homeserver.db с большим количеством больших таблиц это занимает 100 часов, чтобы сбросить shema.разве не существует способ просто выгрузить эту таблицу из моей базы данных, удалить ее внутри БД и снова вставить измененную таблицу? – rubo77