ЗМІНИТЬ СТОЛЬБУ в sqlite


81

Як змінити стовпець у sqlite? Це вPostgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

Я вважаю, що в sqlite взагалі немає ALTER COLUMN, підтримується лише ALTER TABLE.

Будь-яка ідея? Дякую!


ви запитуєте синтаксис ALTER COLUMN, але не говорите, що хочете зробити. Це змушує мене думати, що це занадто широко. ALTER COLUMN міг би багато чого зробити, ви хочете скинути не нульове обмеження, як у прикладі pg?
Еван Керролл,

якщо ви використовували інструменти dll intellj, при зміні стовпця він генерував би команди для вашого sqlite.
дурний кліт

Відповіді:


111

У sqlite немає ALTER COLONM.

Я вважаю, що ваш єдиний варіант - це:

  • Перейменуйте таблицю на тимчасову назву
  • Створіть нову таблицю без обмеження 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**  

ЛІТЕРАТУРА:


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

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

ЗМІНИТЬ СИНТАКСИС СТОЛУ


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. ВСТАВИТИ У t1_backup ВИБЕРІТЬ a, b ВІД t1;
  4. ТАБЛИЦЯ КРАПЛЕННЯ t1;
  5. СТВОРИТИ ТАБЛИЦЮ t1 (a, b);
  6. ВСТАВИТИ У t1 ВИБЕРІТЬ a, b ІЗ t1_backup;
  7. ТАБЛИЦЯ КРАПЛЕННЯ t1_backup;
  8. Здійснити

Детальніше ви можете переглянути за посиланням .


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

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