ALTER COLUMN в sqlite

56

Как изменить колонку в sqlite? Это находится в Postgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

Я уверен, что в sqlite вообще нет ALTER COLUMN, поддерживается только ALTER TABLE.

Любая идея? Спасибо!

  • 0
    вы запрашиваете синтаксис ALTER COLUMN, но не говорите, что хотите сделать. Это заставляет меня думать, что это слишком широко. ALTER COLUMN мог бы многое сделать, вы хотите отменить ограничение not null, как в примере с pg?
Теги:
sqlite3

5 ответов

80
Лучший ответ

В sqlite нет ALTER COLUMN.

Я считаю, что ваш единственный вариант:

  • Переименуйте таблицу во временное имя
  • Создайте новую таблицу без ограничения NOT NULL
  • Скопировать содержимое старой таблицы в новую.
  • Удалить старую таблицу

https://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table подробно описывает процесс

57

Хотя верно, что нет 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 3.7.4
Введите ".help" для получения инструкций
Введите SQL-запросы, завершенные символом ";"
sqlite > создать таблицу КНИГИ (название ТЕКСТ NOT NULL, publication_date ТЕКСТ НЕТ);
sqlite > вставить в ЦЕННОСТИ КНИГИ ( "NULLTEST", null);
Ошибка: BOOKS.publication_date не может быть NULL
sqlite > PRAGMA writable_schema = 1;
sqlite > UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS (название ТЕКСТ NOT NULL, publication_date TEXT)' ГДЕ ИМЯ = 'КНИГИ';
sqlite > PRAGMA writable_schema = 0;
sqlite > .q

Y: > sqlite3 booktest
Версия SQLite 3.7.4
Введите ".help" для получения инструкций
Введите SQL-запросы, завершенные символом ";"
sqlite > вставить в ЦЕННОСТИ КНИГИ ( "NULLTEST", null);
sqlite > .q

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


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

[alter table] (Из http://www.sqlite.org/lang_altertable.html)
SQLite поддерживает ограниченное подмножество ALTER TABLE. Команда ALTER TABLE в SQLite позволяет пользователю переименовать таблицу или добавить новый столбец в существующую таблицу. Невозможно переименовать столбец, удалить столбец или добавить или удалить ограничения из таблицы.

Изображение 1119

  • 7
    Этот метод работал для меня, хотя, чтобы избежать ситуаций, в которых столбцы могут быть в другом порядке (то есть из предыдущей команды ADD COLUMN), я использовал: UPDATE SQLITE_MASTER SET SQL = replace (SQL, '[MyColumn] integer NOT NULL' , '[MyColumn] integer NULL') WHERE NAME = 'MyTable'. Кроме того, будьте осторожны, чтобы не выполнять это как часть транзакции - это может помешать выполнению некоторых из предыдущих команд транзакции.
27

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

  • BEGIN TRANSACTION;
  • СОЗДАТЬ ВРЕМЕННЫЙ ТАБЛИЦ t1_backup (a, b);
  • INSERT INTO t1_backup SELECT a, b FROM t1;
  • ТАБЛИЦА DROP t1;
  • CREATE TABLE t1 (a, b);
  • INSERT INTO t1 SELECT a, b FROM t1_backup;
  • ТАБЛИЦА DROP t1_backup;
  • COMMIT

Подробнее см. ссылку .

  • 0
    Чтобы переименовать таблицу: ALTER TABLE table1 RENAME TO table2;
  • 0
    Не забудьте индексы. Запустите .schema для генерации оператора create с индексами.
4

Ни один из других ответов неверен, но я нашел самый простой способ обработки сложных ALTERs через Sqliteman (FOSS).

Он будет обрабатывать действие жонглирования (как описано в других ответах) для вас.

Выберите таблицу books_book, через Меню: Контекст > Изменить таблицу: Отменить проверку NULL > Изменить, сделать

См. Sqliteman Doc: Изменить таблицу

0

Для тех, кто ищет и находит эту страницу в этом году 2017 года: Если вы новичок в SQLite и/или предпочитаете графический интерфейс, "sqlitebrowser" сделает это за несколько кликов.

  • "Файл" - "Открыть базу данных"
  • На вкладке "Структура базы данных" щелкните содержимое таблицы (не имя таблицы), затем "Изменить", "Изменить таблицу", и теперь вы можете изменить тип данных любого столбца с помощью выпадающего меню. Я изменил поле "текст" на "числовое", чтобы получить данные в диапазоне номеров.

Программа "sqlitebrowser" (DB Browser for SQLite) является открытым исходным кодом и бесплатна. Для Linux он доступен из репозитория. Надеюсь, это поможет кому-то!

Ещё вопросы

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