Obtenga la instrucción Insert para la fila existente en MySQL


139

Usando MySQL puedo ejecutar la consulta:

SHOW CREATE TABLE MyTable;

Y devolverá la instrucción de creación de tabla para la tabla específica. Esto es útil si ya tiene una tabla creada y desea crear la misma tabla en otra base de datos.

¿Es posible obtener la instrucción de inserción para una fila o conjunto de filas ya existente? Algunas tablas tienen muchas columnas, y sería bueno para mí poder obtener una declaración de inserción para transferir filas a otra base de datos sin tener que escribir la declaración de inserción, o sin exportar los datos a CSV y luego importar los mismos datos en la otra base de datos.

Solo para aclarar, lo que quiero es algo que funcione de la siguiente manera:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

Y me han devuelto lo siguiente:

INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');

¿Qué herramienta utilizas para conectarte a la base de datos? Algunos programas proporcionan tales plantillas.
GôTô

2
@kibbee, ¿Has encontrado alguna solución para esto?
Hasina

2
Me encantaría una respuesta que mostrara las declaraciones INSERT del mysql>aviso. Ninguno hasta ahora.
Bob Stein

¿Ha encontrado alguna solución para esto, para obtener la declaración de inserción mediante programación?
Vaibhav Jain el

Respuestas:


156

No parece haber una manera de obtener las INSERTdeclaraciones de la consola MySQL, pero puede obtenerlas usando mysqldump como sugirió Rob. Especifique -tpara omitir la creación de la tabla.

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"

Vea esto si obtiene el error mysqldump: No se pudo ejecutar 'SELECT @@ GTID_MODE': Variable de sistema desconocida 'GTID_MODE' (1193) gist.github.com/arun057/5556563
Daniel Schaffer

10
Y puede agregar "--complete-insert" si desea los nombres de campo / columna con la instrucción insert
MeatPopsicle

3
- transacción
única

y --hex-blobsi tiene columnas de blob (por ejemplo a bit(1)), de lo contrario lo escribiría como una cadena, lo que podría provocar un Unknown command '\0'error al ejecutar INSERT.
moffeltje

79

En MySQL Workbench puede exportar los resultados de cualquier consulta de tabla única como una lista de INSERTdeclaraciones. Simplemente ejecute la consulta y luego:

Instantánea del botón de exportación

  1. haga clic en el disquete cerca Export/Importde los resultados
  2. dar un nombre al archivo de destino
  3. en la parte inferior de la ventana, para FormatseleccionarSQL INSERT statements
  4. hacer clic Save
  5. hacer clic Export

2
Además, el icono a la derecha es muy útil para importar la exportación que acaba de crear. Muy buena característica. La única parte difícil es que solo puede acceder a los iconos desde el panel de conjunto de resultados después de una selección.
Half_Duplex

13

Como copió la tabla con el SQL producido por SHOW CREATE TABLE MyTable , puede hacer lo siguiente para cargar los datos en la nueva tabla.

INSERT INTO dest_db.dest_table SELECT * FROM source_db.source_table;

Si realmente quiere las declaraciones INSERT, entonces la única forma que conozco es usar mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm . Puede darle opciones para simplemente volcar datos para una tabla específica e incluso limitar filas.


Las bases de datos en cuestión existen en máquinas físicamente diferentes, en diferentes redes, por lo que este método no funcionaría para mí, pero funciona bien para bases de datos que se ejecutan en la misma instancia de MySQL
Kibbee

¿Está tratando de mover programáticamente subconjuntos de datos entre máquinas? ¿No podría esclavizar la segunda máquina para reflejar los datos y luego mover sus subconjuntos entre las bases de datos en el esclavo?
Rob Prouse

1
Digamos que tengo una tabla que contiene zonas horarias. Ahora, por alguna razón, se crea una nueva zona horaria (tal vez con un desplazamiento de 15 minutos o algo así). Entonces agrego la nueva fila a la base de datos de desarrollo que contiene toda la información sobre la nueva zona horaria y hago todas las pruebas necesarias. Cuando llega el momento de mover esa información de zona horaria a la base de datos de producción, tengo que crear una declaración de inserción desde cero o hacer una exportación / importación. Sería bueno poder obtener el inserto y luego incluirlo en los scripts para poner en funcionamiento la nueva zona horaria.
Kibbee

1
No tengo el inserto original porque puede que lo haya insertado usando una herramienta GUI, o puede que haya tenido que cambiarlo 3 veces de los valores originales que inserté.
Kibbee

1
Por casualidad necesitaba una solución simple para bases de datos en la misma máquina y Google me trajo aquí. Así que estoy agradecido por esta respuesta, incluso si estaba fuera de contexto de la pregunta original :)
Jason McCarrell

10

Escribí una función php que hará esto. Necesitaba hacer una declaración de inserción en caso de que un registro deba reemplazarse después de eliminarlo para una tabla de historial:

function makeRecoverySQL($table, $id)
{
    // get the record          
    $selectSQL = "SELECT * FROM `" . $table . "` WHERE `id` = " . $id . ';';

    $result = mysql_query($selectSQL, $YourDbHandle);
    $row = mysql_fetch_assoc($result); 

    $insertSQL = "INSERT INTO `" . $table . "` SET ";
    foreach ($row as $field => $value) {
        $insertSQL .= " `" . $field . "` = '" . $value . "', ";
    }
    $insertSQL = trim($insertSQL, ", ");

    return $insertSQL;
}

3
Esta solución es bastante frágil. Por ejemplo, si uno de sus registros contiene el nombre O' Malley, las consultas generadas tendrán errores de sintaxis debido a comillas simples que no coinciden. Al menos deberías usarlo mysql_real_escape_stringsi vas por esta ruta.
Eric Seastrand

sigue siendo algo agradable, lo
usaré

9

El código de Laptop Lift funciona bien, pero pensé que a algunas personas les gustaría.

El manejador de la base de datos es un argumento, no codificado. Usé la nueva API de MySQL. Reemplazó $ id con un argumento opcional $ where para mayor flexibilidad. Se usó real_escape_string en caso de que alguien haya intentado hacer una inyección sql y evitar roturas simples que involucren comillas. Usé la INSERT table (field...) VALUES (value...)...sintaxis para que los campos se definan solo una vez y luego solo enumeren los valores de cada fila (implode es increíble). Porque Nigel Johnson lo señaló, agregué NULLmanejo.

Solía $array[$key]hacerlo porque me preocupaba que pudiera cambiar de alguna manera, pero a menos que algo esté terriblemente mal, de todos modos no debería.

<?php
function show_inserts($mysqli,$table, $where=null) {
    $sql="SELECT * FROM `{$table}`".(is_null($where) ? "" : " WHERE ".$where).";";
    $result=$mysqli->query($sql);

    $fields=array();
    foreach ($result->fetch_fields() as $key=>$value) {
        $fields[$key]="`{$value->name}`";
    }

    $values=array();
    while ($row=$result->fetch_row()) {
        $temp=array();
        foreach ($row as $key=>$value) {
            $temp[$key]=($value===null ? 'NULL' : "'".$mysqli->real_escape_string($value)."'");
        }
        $values[]="(".implode(",",$temp).")";
    }
    $num=$result->num_rows;
    return "INSERT `{$table}` (".implode(",",$fields).") VALUES \n".implode(",\n",$values).";";
}
?>

No está seguro acerca de la falta INTOde INSERT INTO {$tables}pero no hay manejo de valores nulos en la tabla.
Nigel Johnson

1
@NigelJohnson INTOes completamente opcional . Le agregué el manejo de nulos.
Chinoto Vokro

6

Utilizo el programa SQLYOG donde puedo hacer una consulta de selección, señalar captura de pantallalos resultados y elegir exportar como sql. Esto me da las declaraciones de inserción.


Solo para evitar confusiones, dice formato sql pero en realidad exporta en formato mysql.
Kumar Vikramjeet

Gracias .... +1 ya que funcionó para mí. Pero no se pudo obtener solo para las filas seleccionadas. :( Su método que proporciona la consulta de inserción para todas las filas de la tabla.
Mukit09

5

Dentro del banco de trabajo MySQL, realice lo siguiente:

  1. Haga clic en Servidor> Exportar datos

  2. En la pestaña de selección de objetos, seleccione el esquema deseado.

  3. Luego, seleccione las tablas deseadas usando el cuadro de lista a la derecha del esquema.

  4. Seleccione una ubicación de archivo para exportar el script.

  5. Haz clic en Finalizar.

  6. Navegue hasta el archivo recién creado y copie las instrucciones de inserción.


esta es una exportación de tabla completa, no una exportación de filas específicas
Yehia

4

Si desea obtener "insertar declaración" para su tabla, puede probar el siguiente código.

SELECT 
    CONCAT(
        GROUP_CONCAT(
            CONCAT(
                'INSERT INTO `your_table` (`field_1`, `field_2`, `...`, `field_n`) VALUES ("',
                `field_1`,
                '", "',
                `field_2`,
                '", "',
                `...`,
                '", "',
                `field_n`,
                '")'
            ) SEPARATOR ';\n'
        ), ';'
    ) as `QUERY`
FROM `your_table`;

Como resultado, tendrá una declaración de insers:

INSERT INTO your_table( field_1, field_2, ..., field_n) VALORES (Valor_11, value_12, ..., value_1n);

INSERT INTO your_table( field_1, field_2, ..., field_n) VALORES (value_21, Valor_22, ..., value_2n);

/ ................................................. .... /

INSERT INTO your_table( field_1, field_2, ..., field_n) VALORES (value_m1, value_m2, ..., value_mn);

, donde m - número de registros en su_tabla


44
¿Quizás podría proporcionar un poco más a su respuesta que un simple bloque de código pegado?
Matt Fletcher el

sí, pero esto está codificado, field_ * son nombres estáticos. Hace la mitad del trabajo, y no lo hace tan bien
Daniele Cruciani

¿Por qué GROUP_CONCAT?
sealabr

3

puede usar Sequel pro para hacer esto, hay una opción para 'obtener como declaración de inserción' para los resultados obtenidos


3

En PHPMyAdmin puedes:

  1. haga clic en copiar en la fila que desea conocer sus instrucciones de inserción SQL:

Seleccionar copia

  1. haga clic en Vista previa de SQL:

Seleccione Vista previa

  1. obtendrá la instrucción de inserción creada que la genera

Puede aplicar eso en muchas filas a la vez si las selecciona y hace clic en copiar desde la parte inferior de la tabla y luego en Vista previa SQl


Agregue más explicaciones e información a su respuesta
Ramin eghbalian

2

Para usuarios de HeidiSQL :

Si usa HeidiSQL, puede seleccionar la (s) fila (s) que desea obtener la declaración de inserción. Luego haga clic con el botón derecho> Exportar filas de cuadrícula> seleccione "Copiar al portapapeles" para "Destino de salida", "Selección" para "Selección de fila" para que no exporte otras filas, "INSERTOS SQL" para "Formato de salida"> Haga clic en Aceptar.

ingrese la descripción de la imagen aquí

La declaración de inserción estará dentro de su portapapeles.


1

Con PDO puedes hacerlo de esta manera.

$stmt = DB::getDB()->query("SELECT * FROM sometable", array());

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $fields = array_keys($array[0]);

    $statement = "INSERT INTO user_profiles_copy (".implode(",",$fields).") VALUES ";
    $statement_values = null;

    foreach ($array as $key => $post) {
        if(isset($statement_values)) {
            $statement_values .= ", \n";
        }

        $values = array_values($post);
        foreach($values as $index => $value) {
            $quoted = str_replace("'","\'",str_replace('"','\"', $value));
            $values[$index] = (!isset($value) ? 'NULL' : "'" . $quoted."'") ;
        }

        $statement_values .= "(".implode(',',$values).")";


    }
    $statement .= $statement_values . ";";

    echo $statement;

1

Puede crear un SP con el siguiente código: también admite NULLS.

select 'my_table_name' into @tableName;

/*find column names*/
select GROUP_CONCAT(column_name SEPARATOR ', ') from information_schema.COLUMNS
where table_schema =DATABASE()
and table_name = @tableName
group by table_name
into @columns
;

/*wrap with IFNULL*/
select replace(@columns,',',',IFNULL(') into @selectColumns;
select replace(@selectColumns,',IFNULL(',',\'~NULL~\'),IFNULL(') into @selectColumns;

select concat('IFNULL(',@selectColumns,',\'~NULL~\')') into @selectColumns;

/*RETRIEVE COLUMN DATA FIELDS BY PK*/
SELECT
  CONCAT(
    'SELECT CONCAT_WS(','''\'\',\'\''',' ,
    @selectColumns,
    ') AS all_columns FROM ',@tableName, ' where id = 5 into @values;'
    )
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

/*Create Insert Statement*/
select CONCAT('insert into ',@tableName,' (' , @columns ,') values (\'',@values,'\')') into @prepared;

/*UNWRAP NULLS*/
select replace(@prepared,'\'~NULL~\'','NULL') as statement;

0

Creo que la respuesta proporcionada por Laptop Lifts es la mejor ... pero como nadie sugirió el enfoque que uso, pensé que debería intervenir. Utilizo phpMyAdmin para configurar y administrar mis bases de datos la mayor parte del tiempo. En él, simplemente puede poner marcas de verificación junto a las filas que desee, y en la parte inferior, haga clic en "Exportar" y elija SQL. Le dará instrucciones INSERT para los registros que seleccionó. Espero que esto ayude.


-1

Según sus comentarios, su objetivo es migrar los cambios de la base de datos de un entorno de desarrollo a un entorno de producción.

La mejor manera de hacer esto es mantener los cambios de su base de datos en su código fuente y, en consecuencia, rastrearlos en su sistema de control de fuente, como git o svn.

puedes ponerte en marcha rápidamente con algo como esto: https://github.com/davejkiger/mysql-php-migrations

Como una solución personalizada muy básica en PHP, puede utilizar una función como esta:

function store_once($table, $unique_fields, $other_fields=array()) {
    $where = "";
    $values = array();
    foreach ($unique_fields as $k => $v) {
        if (!empty($where)) $where .= " && ";
        $where .= "$k=?";
        $values[] = $v;
    }
    $records = query("SELECT * FROM $table WHERE $where", $values);
    if (false == $records) {
        store($table, array_merge($unique_fields, $other_fields));
    }
}

entonces puede crear un script de migración que actualizará cualquier entorno a sus especificaciones.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.