Copia de la estructura de tabla para la tabla nueva en sqlite3

Hay una manera fácil de copiar una estructura de tabla existente a uno nuevo?
(no necesita los datos, sólo la estructura -> como id INTEGER, nombre varchar(20) …)

Thx

InformationsquelleAutor leon22 | 2012-10-04

5 Kommentare

  1. 80

    Usted podría usar un comando como este:

    CREATE TABLE copied AS SELECT * FROM mytable WHERE 0

    pero debido a SQLite del tipado dinámico, la mayoría de los tipos de información se perdería.

    Si usted sólo necesita una tabla en la que se comporta igual que el original, es decir, tiene el mismo número y los nombres de las columnas, y puede almacenar los mismos valores, esto es suficiente.

    Si usted realmente necesita un tipo de información exactamente igual que el original, se puede leer la versión original de SQL CREATE TABLE declaración de la sqlite_master tabla como esta:

    SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable'
    • Pero ¿cómo se puede utilizar el resultado de la instrucción select para crear la nueva tabla?
    • Creo que indiekiduk es preguntar si hay una forma de programación de hacerlo desde dentro del SQL, y creo que es una buena pregunta. Si hay una manera de hacer esto sería una mejora para la respuesta.
    • Sugerencia: Si ha agregado un índice a la tabla (y lo quieres en tu nueva tabla) puede recuperar sus SQL desde sqlite_master el uso de: SELECCIONE sql DESDE sqlite_master DONDE type=’index’ Y tbl_name=’mitabla’ y sql no es nulo; – Aviso que estoy usando en el campo llamado tbl_name porque el nombre de campo almacenará el nombre del ÍNDICE, no de la MESA
  2. 11

    SQLite no puede clonar tabla con PK, valores predeterminados y los índices.

    Hacking por otra herramienta es necesaria.

    En la concha, reemplazar el nombre de la tabla de la sed.

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

    Y usted puede comprobar la nueva tabla.

    sqlite3 dbfile '.schema newtable'

    Clave principal, los valores predeterminados y los índices serán reservados.

    Espero que este comando puede ayudar.

  3. 0

    sqlite> .esquema

    CREATE TABLE [About](
      [id],
      [name],
      [value]);

    .esquema de comando le dará estructura de Sobre-mesa de cómo se podría hacer mediante la programación de SQLite intérprete de la mano, escribiendo comandos.

    Pegar y ejecutar, CREAR el bloque de dar el nuevo nombre de la tabla:

    sqlite> CREATE TABLE [AboutToo](
      [id],
      [name],
      [value]);

    .tablas de comandos ahora se va a demostrar que tiene dos tablas, viejos y nuevos «copiado».

    sqlite> .tables
    About     AboutToo

    p.s. sqlite> es símbolo del sistema se obtiene en la consola después de su lanzamiento SQLite.exe intérprete. Para conseguir que se vaya a http://www.sqlite.org

    • Parece CREAR una TABLA con Asombro COMO SELECT * FROM Acerca de; hace el mismo trabajo, hace copia.
  4. 0

    Sólo para el registro – Esto funcionó para mí:

    CREATE TABLE mytable (
        contact_id INTEGER PRIMARY KEY,
        first_name TEXT NOT NULL,
        last_name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE,
        phone TEXT NOT NULL UNIQUE
    );
    
    -- Two variations
    INSERT INTO mytable VALUES ( 1, "Donald", "Duck", "[email protected]", "1234");
    INSERT INTO mytable ( contact_id,first_name,last_name,email,phone ) VALUES ( 2, "Daisy", "Duck", "[email protected]", "45678");
    
    .output copied.sql
    -- Add new table name
    .print CREATE TABLE copied ( 
    -- Comment out first line from SQL
    SELECT "-- " || sql FROM sqlite_master WHERE type='table';
    .output 
    .read copied.sql
    .schema
    select * from copied;

    Ten en cuenta que esto sólo funciona si el esquema está envuelto después de CREATE TABLE mytable (.
    De lo contrario necesitarás algunos cadena de reemplazo con .system

  5. -1

    Yo preferiría :

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

    La línea anterior genera el volcado de la tabla que incluya los DDL y DML declaración.

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

    También, sustituir "CREATE TRIGGER " con "CREATE TRIGGER <NEWTABLE>_" , este reemplazará a la existente activa con los nombres de los desencadenadores con un nuevo nombre de la tabla en él. Que le hacen único y no va a causar conflictos con los desencadenadores existentes. Una vez que todos los cambios de esquema se implementa, la lectura en la base de datos utilizando .read

    sqlite3 > .read output_file

    Esto puede ser secuencias de comandos en el shell de archivos mediante comandos de 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 usted tiene la tabla T y la nueva tabla es TClone en el archivo de base de datos D con el archivo de F en la creación de : a continuación,

    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, se puede generalizar esta secuencia de comandos mediante la creación de un parametrizada versión donde usted puede pasar source_table, destination_table , db_file como los parámetros que se pueden utilizar para clonar cualquier mesa.

    He probado y funciona.

    Pruebas :

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

    debe dar los mismos resultados de la tabla original. y

    sqlite3 > .schema <new_table>

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea