2012-10-04 3 views

Antwort

59

Sie einen Befehl wie diesen verwenden:

CREATE TABLE copied AS SELECT * FROM mytable WHERE 0 

aber Aufgrund der dynamischen Typisierung von SQLite würden die meisten Typinformationen verloren gehen.

Wenn Sie nur eine Tabelle benötigen, die sich wie das Original verhält, d. H. Die gleiche Anzahl und Namen von Spalten hat und dieselben Werte speichern kann, ist dies ausreichend.

Wenn Sie wirklich die Typinformationen genau wie das Original benötigen, können Sie die ursprüngliche SQL CREATE TABLE Anweisung aus der sqlite_master Tabelle, wie dies lesen:

SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable' 
+2

Aber wie verwenden Sie die Ausgabe von Ihrer Select-Anweisung, um die neue Tabelle zu erstellen? – malhal

+1

Es ist der SQL-Befehl. Du führst es aus. –

+4

Ich denke Indiekiduk fragt, ob es eine Möglichkeit gibt, das programmatisch aus dem SQL heraus zu tun, und ich denke, es ist eine gute Frage. Wenn es einen Weg gibt, dies zu tun, wäre dies eine Verbesserung der Antwort. – metasoarous

9

SQLite kann nicht Tabelle klonen mit PK, Standardwerte und Indizes.

Hacking mit einem anderen Werkzeug ist notwendig.

Ersetzen Sie in der Shell den Tabellennamen durch sed.

sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile 

Und Sie können neue Tabelle überprüfen.

sqlite3 dbfile '.schema newtable' 

Primärschlüssel, Standardwerte und Indizes sind reserviert.

Ich hoffe, dieser Befehl kann Ihnen helfen.

-1

Ich würde es vorziehen:

> sqlite3 <db_file> 

sqlite3 > .output <output_file> 
sqlite3 > .dump <table_name> 

Die Zeile oben erzeugt die Dump-Tabelle, die DDL und DML-Anweisung enthält.

Bearbeite in dieser Datei, das heißt finden und den Tabellennamen Namen mit neuer Tabelle

Auch ersetzen "CREATE TRIGGER " mit "CREATE TRIGGER <NEWTABLE>_", wird dies ersetzen bestehende Trigger mit Trigger-Namen mit einem neuen Tabellennamen auf sich ersetzen. Das macht es einzigartig und wird keine Konflikte mit bestehenden Triggern verursachen. Sobald alle Schemaänderungen umgesetzt werden, lesen Sie es zurück in die Datenbank .read

sqlite3 > .read output_file 

Verwendung Dies kann wie in Shell-Datei unter Verwendung von Shell-Befehlen scripted werden:

echo ".dump <table>" | sqlite3 <db_file> > <table_file> 
sed -i.bak "s/\b<table_name>\b/<new_table_name>/g" <table_file> 
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER <new_table_name_>/g" <table_file> 
echo ".read <table_file>" | sqlite3 <db_file> 
rm <table_name>.bak 

Zum Beispiel:

Wenn Sie Tabelle T und neue Tabelle ist TClone in db-Datei D mit Datei F erstellt werden: dann

echo ".dump T" | sqlite3 D.sqlite > F 
sed -i.bak "s/\bT\b/TClone/g" F 
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER TClone_>/g" F 
echo ".read F" | sqlite3 D.sqlite 
rm T.bak 

Schließlich können Sie dieses Skript verallgemeinern, indem Sie eine parametrisierte Version erstellen, in der Sie source_table, destination_table, db_file als Parameter übergeben können, die zum Klonen jeder Tabelle verwendet werden können.

Ich habe das getestet und es funktioniert.

Testing:

sqlite3 <database_file> 
sqlite3 > select * from <new_table>; 

sollten Sie dieselben Ergebnisse wie Original-Tabelle geben. und

sqlite3 > .schema <new_table> 

sollte dasselbe Schema wie die ursprüngliche Tabelle mit einem neuen Namen haben.