Gibt es eine einfache Möglichkeit, eine vorhandene Tabellenstruktur in eine neue zu kopieren? (nicht die Daten benötigen, nur die Struktur -> wie id integer, name varchar (20), ...)Tabellenstruktur in neue Tabelle in sqlite3 kopieren
Thx
Gibt es eine einfache Möglichkeit, eine vorhandene Tabellenstruktur in eine neue zu kopieren? (nicht die Daten benötigen, nur die Struktur -> wie id integer, name varchar (20), ...)Tabellenstruktur in neue Tabelle in sqlite3 kopieren
Thx
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'
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.
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.
Aber wie verwenden Sie die Ausgabe von Ihrer Select-Anweisung, um die neue Tabelle zu erstellen? – malhal
Es ist der SQL-Befehl. Du führst es aus. –
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