ALTER COLUMN в sqlite
Как изменить колонку в sqlite?
Это находится в Postgresql
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
Я уверен, что в sqlite вообще нет ALTER COLUMN, поддерживается только ALTER TABLE.
Любая идея? Спасибо!
Ответы
Ответ 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 он доступен из репозитория. Надеюсь, это поможет кому-то!