ИЗМЕНИТЬ КОЛОНКУ в sqlite


81

Как изменить столбец в sqlite? Это вPostgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

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

Есть идеи? Благодаря!


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

если вы использовали инструменты intellj db, когда вы меняете столбец, он генерирует команды для вашего sqlite.
foolcage

Ответы:


111

В sqlite нет ALTER COLUMN.

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

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

Этот другой ответ Stackoverflow подробно объясняет процесс


64

Хотя это правда, что 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**  

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


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

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

ALTER TABLE SYNTAX


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

32

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

  1. НАЧАТЬ СДЕЛКУ;
  2. СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ t1_backup (a, b);
  3. INSERT INTO t1_backup SELECT a, b FROM t1;
  4. ТАБЛИЦА ПАДЕНИЯ t1;
  5. СОЗДАТЬ ТАБЛИЦУ t1 (a, b);
  6. INSERT INTO t1 SELECT a, b FROM t1_backup;
  7. УДАЛИТЬ ТАБЛИЦУ t1_backup;
  8. COMMIT

Более подробно вы можете пройти по ссылке .


Чтобы переименовать таблицу: ALTER TABLE table1 RENAME TO table2;
live-love

Не забывайте индексы. Запустите .schema, чтобы сгенерировать оператор create с индексами.
живая любовь
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.