2009-12-10 2 views

Antwort

73

SQLite unterstützt den Befehl alter table drop constraint nicht. Sie müssen eine neue Tabelle ohne Einschränkung erstellen, die Daten übertragen und dann die alte Tabelle löschen.

Ich denke, so etwas wie die folgenden funktionieren sollte:

CREATE TABLE child2 ( 
    id INTEGER PRIMARY KEY, 
    parent_id INTEGER, 
    description TEXT 
); 
INSERT INTO child2 (id, parent_id, description) 
    SELECT id, parent_id, description FROM CHILD; 
DROP TABLE child; 
ALTER TABLE child2 RENAME TO child; 

Sie auch parent_id von allen Aussagen über auslassen könnte, wenn Sie nicht wollen, dass es übertragen.

+0

Trauriges Gesicht. Das habe ich mir gedacht. Ich hoffte, dass ich das "weggelassene" Dokument missverstand. –

+1

Sie können auch die obigen Schritte 1 und 2 in eine SQL-Anweisung kombinieren: "create table child2 as select * from child;" obwohl Sie die PK-Einschränkung manuell hinzufügen müssten. – chacmool

+1

@chacmool Sie können eine PK-Einschränkung nicht manuell hinzufügen, nachdem die Tabelle erstellt wurde. [SQLite Docs] (https://www.sqlite.org/lang_createtable.html) –

4

Ich denke, dies ist ein einfacher, prägnanter Ansatz:

copy db.sqlite3 backup-db.sqlite3 
echo .dump tablename | sqlite3 db.sqlite3 > modify.sql 
(now delete or change the constraint in modify.sql) 
echo drop table tablename; | sqlite3 db.sqlite3 
sqlite3 db.sqlite3 < modify.sql 

Sie können nun die neue Datenbanktabelle redump und die Unterschiede vergleichen.

+1

Unter Linux/sh müssen Sie möglicherweise 'echo drop table tabellenname \;' verwenden. Beachten Sie den umgekehrten Schrägstrich vor dem Semikolon. – jftuga

+1

Bedenken Sie auch, dass Sie mit der Vorgehensweise von paxdiablo den gesamten Vorgang in eine Transaktion einfügen können, die bei einem fehlgeschlagenen Schritt zurückgesetzt wird und Ihre Datenbank in ihrem ursprünglichen Zustand belässt. Bei Ihrem Ansatz sollten Sie in den Schritten 2, 4 und 5 nach Fehlern suchen und entsprechend abbrechen, wodurch der Code viel weniger prägnant wird. –

+0

SQLiteStudio ermöglicht es Ihnen, die gesamte Datenbank als SQL zu exportieren. Dadurch können Sie ähnlich wie jftuga mit dem Befehlszeilenprogramm vorgehen. –

Verwandte Themen