Esiste un modo semplice per copiare una struttura di tabella esistente in una nuova? (non avete bisogno dei dati, solo la struttura -> come id INTEGER, nome varchar (20) ...)Copia la struttura della tabella nella nuova tabella in sqlite3
Thx
Esiste un modo semplice per copiare una struttura di tabella esistente in una nuova? (non avete bisogno dei dati, solo la struttura -> come id INTEGER, nome varchar (20) ...)Copia la struttura della tabella nella nuova tabella in sqlite3
Thx
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'
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.
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.
Ma come si utilizza l'output dell'istruzione select per creare la nuova tabella? – malhal
È il comando SQL. Lo esegui. –
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