ALTER COLUMN in sqlite


81

Wie ändere ich die Spalte in SQLite? Das ist inPostgresql

ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;

Ich glaube, es gibt überhaupt keine ALTER COLUMN in SQLite, nur ALTER TABLE wird unterstützt.

Irgendeine Idee? Vielen Dank!


Sie fragen nach einer ALTER COLUMN-Syntax, sagen aber nicht, was Sie tun möchten. Das lässt mich denken, dass dies zu weit gefasst ist. ALTER COLUMN könnte viel bewirken. Möchten Sie die Nicht-Null-Einschränkung wie im pg-Beispiel löschen?
Evan Carroll

Wenn Sie die Intellj DB-Tools verwenden und die Spalte ändern, werden die Befehle für Ihr SQLite generiert.
Dummkopf

Antworten:


111

Es gibt keine ALTER COLUMN in SQLite.

Ich glaube, Ihre einzige Option ist:

  • Benennen Sie die Tabelle in einen temporären Namen um
  • Erstellen Sie eine neue Tabelle ohne die NOT NULL-Einschränkung
  • Kopieren Sie den Inhalt der alten Tabelle in die neue
  • Entfernen Sie den alten Tisch

Diese andere Stackoverflow-Antwort erläutert den Vorgang ausführlich


64

Es ist zwar richtig, dass es sich nicht um ALTER COLUMN handelt. Wenn Sie jedoch nur die Spalte umbenennen, die NOT NULL-Einschränkung löschen oder den Datentyp ändern möchten, können Sie die folgenden gefährlichen Befehle verwenden:

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;

Sie müssen entweder Ihre Verbindung schließen und erneut öffnen oder die Datenbank staubsaugen, um die Änderungen erneut in das Schema zu laden.

Zum Beispiel:

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

FOLGENDE REFERENZEN:


pragma writable_schema
Wenn dieses Pragma aktiviert ist, die SQLITE_MASTER-Tabellen, in denen die Datenbank mit normalen UPDATE-, INSERT- und DELETE-Anweisungen geändert werden kann. Warnung: Der Missbrauch dieses Pragmas kann leicht zu einer beschädigten Datenbankdatei führen.

[Tabelle ändern] (Von http://www.sqlite.org/lang_altertable.html )
SQLite unterstützt eine begrenzte Teilmenge von ALTER TABLE. Mit dem Befehl ALTER TABLE in SQLite kann der Benutzer eine Tabelle umbenennen oder einer vorhandenen Tabelle eine neue Spalte hinzufügen. Es ist nicht möglich, eine Spalte umzubenennen, eine Spalte zu entfernen oder Einschränkungen zu einer Tabelle hinzuzufügen oder daraus zu entfernen.

ALTER TABLE SYNTAX


7
Diese Methode hat bei mir funktioniert. Um jedoch Situationen zu vermeiden, in denen die Spalten möglicherweise in einer anderen Reihenfolge vorliegen (dh von einem vorherigen Befehl ADD COLUMN), habe ich Folgendes verwendet: UPDATE SQLITE_MASTER SET SQL = replace (SQL, '[MyColumn] Ganzzahl NICHT NULL' , '[MyColumn] integer NULL') WHERE NAME = 'MyTable'. Achten Sie auch darauf, dies nicht als Teil einer Transaktion auszuführen. Dies kann dazu führen, dass einige der früheren Transaktionsbefehle nicht ausgeführt werden.
Ross

32

SQLite unterstützt eine begrenzte Teilmenge von ALTER TABLE. Mit dem Befehl ALTER TABLE in SQLite kann der Benutzer eine Tabelle umbenennen oder einer vorhandenen Tabelle eine neue Spalte hinzufügen. Es ist nicht möglich, eine Spalte umzubenennen, eine Spalte zu entfernen oder Einschränkungen zu einer Tabelle hinzuzufügen oder daraus zu entfernen. Sie können den Datentyp der Tabellenspalte oder eine andere Eigenschaft jedoch durch die folgenden Schritte ändern.

  1. TRANSAKTION BEGINNEN;
  2. CREATE TEMPORARY TABLE t1_backup (a, b);
  3. INSERT INTO t1_backup SELECT a, b FROM t1;
  4. TROPFENTABELLE t1;
  5. TABELLE ERSTELLEN t1 (a, b);
  6. INSERT IN t1 SELECT a, b FROM t1_backup;
  7. DROP TABLE t1_backup;
  8. VERPFLICHTEN

Weitere Informationen finden Sie unter dem Link .


So benennen Sie die Tabelle um: ALTER TABLE table1 RENAME TO table2;
Live-Liebe

Indizes nicht vergessen. Führen Sie .schema aus, um eine create-Anweisung mit Indizes zu generieren.
Live-Liebe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.