Подтвердить что ты не робот

ALTER COLUMN в sqlite

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

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

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

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

4b9b3361

Ответ 1

В sqlite нет ALTER COLUMN.

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

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

fooobar.com/questions/29557/... подробно описывает процесс

Ответ 2

Хотя верно, что нет 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 позволяет пользователю переименовать таблицу или добавить новый столбец в существующую таблицу. Невозможно переименовать столбец, удалить столбец или добавить или удалить ограничения из таблицы.

ALTER TABLE SYNTAX

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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