ALTER COLUMN w sqlite


81

Jak zmienić kolumnę w sqlite? To jest wPostgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

Uważam, że w sqlite nie ma w ogóle ALTER COLUMN, obsługiwana jest tylko opcja ALTER TABLE.

Dowolny pomysł? Dzięki!


pytasz o składnię ALTER COLUMN, ale nie mówisz, co chcesz zrobić. To sprawia, że ​​myślę, że jest to zbyt szerokie. ALTER COLUMN może wiele zdziałać, czy chcesz porzucić ograniczenie niezerowe, jak w przykładzie pg?
Evan Carroll,

jeśli używane narzędzia intellj db, po zmianie kolumny wygenerują polecenia dla twojego sqlite.
foolcage

Odpowiedzi:


111

W sqlite nie ma ALTER COLUMN.

Uważam, że jedyną opcją jest:

  • Zmień nazwę tabeli na tymczasową
  • Utwórz nową tabelę bez ograniczenia NOT NULL
  • Skopiuj zawartość starej tabeli do nowej
  • Usuń stary stół

Ta inna odpowiedź Stackoverflow wyjaśnia szczegółowo ten proces


64

Chociaż prawdą jest, że nie ma ALTER COLUMN, jeśli chcesz tylko zmienić nazwę kolumny, usunąć ograniczenie NOT NULL lub zmienić typ danych, możesz użyć następującego zestawu niebezpiecznych poleceń:

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;

Będziesz musiał zamknąć i ponownie otworzyć połączenie lub odkurzyć bazę danych, aby ponownie załadować zmiany w schemacie.

Na przykład:

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**  

ODNIESIENIA NASTĘPUJĄCE:


pragma writable_schema
Gdy ta pragma jest włączona, tabele SQLITE_MASTER, w których można zmienić bazę danych za pomocą zwykłych instrukcji UPDATE, INSERT i DELETE. Ostrzeżenie: niewłaściwe użycie tej pragmy może łatwo spowodować uszkodzenie pliku bazy danych.

[alter table] (z http://www.sqlite.org/lang_altertable.html )
SQLite obsługuje ograniczony podzbiór ALTER TABLE. Polecenie ALTER TABLE w SQLite umożliwia użytkownikowi zmianę nazwy tabeli lub dodanie nowej kolumny do istniejącej tabeli. Nie można zmienić nazwy kolumny, usunąć kolumny ani dodać lub usunąć ograniczeń z tabeli.

ALTER TABLE SYNTAX


7
Ta metoda zadziałała dla mnie, chociaż aby uniknąć sytuacji, w których kolumny mogą być w innej kolejności (tj. Z poprzedniego polecenia ADD COLUMN), użyłem: UPDATE SQLITE_MASTER SET SQL = replace (SQL, '[MyColumn] integer NOT NULL' ' , „[MyColumn] integer NULL”) WHERE NAME = „MyTable”. Uważaj również, aby nie uruchamiać tego jako części transakcji - może to uniemożliwić uruchomienie niektórych wcześniejszych poleceń transakcji.
Ross

32

SQLite obsługuje ograniczony podzbiór ALTER TABLE. Polecenie ALTER TABLE w SQLite umożliwia użytkownikowi zmianę nazwy tabeli lub dodanie nowej kolumny do istniejącej tabeli. Nie można zmienić nazwy kolumny, usunąć kolumny ani dodać lub usunąć ograniczeń z tabeli. Możesz jednak zmienić typ danych kolumny tabeli lub inną właściwość, wykonując następujące kroki.

  1. BEGIN TRANSACTION;
  2. UTWÓRZ TABELĘ TYMCZASOWĄ t1_backup (a, b);
  3. INSERT INTO t1_backup SELECT a, b FROM t1;
  4. DROP TABLE t1;
  5. TWORZENIE TABELI t1 (a, b);
  6. INSERT INTO t1 SELECT a, b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. POPEŁNIĆ

Aby uzyskać więcej informacji, możesz odnieść się do linku .


Aby zmienić nazwę tabeli: ALTER TABLE table1 RENAME TO table2;
miłość na żywo

Nie zapomnij o indeksach. Uruchom .schema, aby wygenerować instrukcję tworzenia z indeksami.
miłość na żywo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.