2012-10-04 16 views

risposta

59

si potrebbe usare un comando come questo:

CREATE TABLE copied AS SELECT * FROM mytable WHERE 0 

ma a causa della digitazione dinamica di SQLite, molte informazioni sul tipo andrebbero perse.

Se è necessaria solo una tabella che si comporta come l'originale, cioè ha lo stesso numero e nome di colonne e può memorizzare gli stessi valori, questo è sufficiente.

Se si ha realmente bisogno le informazioni sul tipo esattamente come l'originale, si può leggere la dichiarazione originale di SQL CREATE TABLE dal tavolo sqlite_master, in questo modo:

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

Ma come si utilizza l'output dell'istruzione select per creare la nuova tabella? – malhal

+1

È il comando SQL. Lo esegui. –

+4

Penso che indiekiduk stia chiedendo se esiste un modo per farlo a livello di programmazione dall'interno dell'SQL, e penso che sia una buona domanda. Se c'è un modo per farlo sarebbe un miglioramento della risposta. – metasoarous

9

SQLite non può clonare tavolo con PK, inadempienze e indici.

È necessario l'hacking da un altro strumento.

Nella shell, sostituire il nome della tabella con sed.

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

E puoi controllare la nuova tabella.

sqlite3 dbfile '.schema newtable' 

Chiave primaria, valori predefiniti e indici saranno riservati.

Spero che questo comando possa aiutarti.

-1

io preferirei:

> sqlite3 <db_file> 

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

La linea di cui sopra genera il dump della tabella che include DDL e DML dichiarazione.

apportare modifiche in questo file, vale a dire trovare e sostituire il nome della tabella con il nuovo nome della tabella

Inoltre, sostituire "CREATE TRIGGER " con "CREATE TRIGGER <NEWTABLE>_", questo andrà a sostituire i trigger esistenti con nomi di trigger con un nuovo nome di tabella su di esso. Ciò lo renderà unico e non causerà conflitti con i trigger esistenti. Una volta che tutti schema sono implementati i cambiamenti, leggere di nuovo nel database utilizzando .read

sqlite3 > .read output_file 

Questo può essere script in file di shell con comandi di shell come:

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 

Ad esempio:

Se si dispone di tabella T e nuova tabella è TClone nel file Db D con il file F da creare: quindi

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 

Infine, è possibile generalizzare questo script creando una versione parametrizzata in cui è possibile passare source_table, destination_table, db_file come parametri che possono essere utilizzati per clonare qualsiasi tabella.

Ho provato questo e funziona.

Testing:

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

dovrebbe darvi stessi risultati di tabella originale. e

sqlite3 > .schema <new_table> 

deve avere lo stesso schema di quello della tabella originale con un nuovo nome.

Problemi correlati