2012-10-04 30 views

Respuesta

59

Se puede usar un comando como este:

CREATE TABLE copied AS SELECT * FROM mytable WHERE 0 

pero debido a la tipificación dinámica de SQLite, la mayoría de la información de tipo se perderá.

Si solo necesita una tabla que se comporte como la original, es decir, tenga el mismo número y nombre de columnas, y pueda almacenar los mismos valores, esto es suficiente.

Si realmente necesita la información de tipo exactamente igual que el original, se puede leer la declaración original de SQL CREATE TABLE de la mesa sqlite_master, así:

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

Pero, ¿cómo se usa el resultado de su declaración de selección para crear la nueva tabla? – malhal

+1

Es el comando SQL. Lo ejecutas. –

+4

Creo que indiekiduk pregunta si hay una forma de hacer esto programáticamente desde el SQL, y creo que es una buena pregunta. Si hay una manera de hacer esto, sería una mejora a la respuesta. – metasoarous

9

SQLite no puede clonar mesa con PK, valores predeterminados e índices.

Es necesario piratear con otra herramienta.

En shell, reemplace el nombre de la tabla por sed.

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

Y puede consultar la nueva tabla.

sqlite3 dbfile '.schema newtable' 

Se reservarán la clave principal, los valores predeterminados y los índices.

Espero que este comando pueda ayudarlo.

-1

yo preferiría:

> sqlite3 <db_file> 

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

La línea anterior genera el volcado de tabla que incluye DDL y DML comunicado.

hacer cambios en este archivo, es decir, buscar y reemplazar el nombre de la tabla con el nuevo nombre de la tabla

Además, reemplace "CREATE TRIGGER " con "CREATE TRIGGER <NEWTABLE>_", ésta sustituirá disparadores existentes con nombres de disparo con un nuevo nombre de la tabla en él. Eso lo hará único y no causará conflictos con los activadores existentes. Una vez que todo el esquema se implementan cambios, lo leyó de nuevo en la base de datos utilizando .read

sqlite3 > .read output_file 

Esto puede ser escrito en el archivo de shell mediante comandos shell como:

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 

Por ejemplo:

Si tiene la tabla T y la nueva tabla son TClone en el archivo db D con el archivo F que se creará: luego

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 

Finalmente, puede generalizar este script creando una versión parametrizada donde puede pasar source_table, destination_table, db_file como parámetros que pueden usarse para clonar cualquier tabla.

He probado esto y funciona.

Pruebas:

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

debería darle mismos resultados que la tabla original. y

sqlite3 > .schema <new_table> 

deben tener el mismo esquema que el de la tabla original con un nuevo nombre.

Cuestiones relacionadas