¿Existe una manera fácil de copiar una estructura de tabla existente a una nueva? (no necesita los datos, sólo la estructura -> como INTEGER ID, nombre varchar (20) ...)Copie la estructura de la tabla en la nueva tabla en sqlite3
Thx
¿Existe una manera fácil de copiar una estructura de tabla existente a una nueva? (no necesita los datos, sólo la estructura -> como INTEGER ID, nombre varchar (20) ...)Copie la estructura de la tabla en la nueva tabla en sqlite3
Thx
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'
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.
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.
Pero, ¿cómo se usa el resultado de su declaración de selección para crear la nueva tabla? – malhal
Es el comando SQL. Lo ejecutas. –
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