2009-08-30 42 views
66

Tengo dos tablas con estructura idéntica, excepto una columna ... La Tabla 2 tiene esa columna adicional en la que insertaría el CURRENT_DATE()MYSQL: ¿Cómo copiar una fila completa de una tabla a otra en mysql con la segunda tabla con una columna adicional?

Me gustaría copiar todos los valores de table1 a table2.

si uso

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5; 

que arroja un error señalando a la diferencia en el número de columnas.

Tengo dos preguntas sobre que:

  1. ¿Cómo consigo alrededor de esto?
  2. y cómo agrego el valor para la columna de fecha adicional (CURRENT_DATE()) en la tabla 2 dentro de esta misma instrucción?
+0

Puede echar un vistazo a esto. Funcionó para mí en mysql. http://stackoverflow.com/questions/57168/how-to-copy-a-row-from-one-sql-server-table-to-another – Shreyo

Respuesta

79

Para refinar la respuesta de Zed, y para responder a su comentario:

INSERT INTO dues_storage 
SELECT d.*, CURRENT_DATE() 
FROM dues d 
WHERE id = 5; 

Véase T. J. Comentario de Crowder

+43

Sea ** MUY CUIDADO ** haciendo esto. Funciona, pero asume que el orden de las columnas en las dos tablas es idéntico; no coincide ** ** con el nombre de la columna, y trata de forzar valores para que quepan, lo que puede provocar resultados inesperados. Ahora, si su estructura de desarrollo le asegura que los pedidos de columna son idénticos, excluya la última columna, es una forma conveniente y sencilla de hacerlo, pero la advertencia es importante. –

+0

Afortunadamente, el orden es el mismo. Tenga en cuenta que debe mantener la estructura idéntica incluso en el futuro. ¡gracias a todos! – user165242

+0

@crunchdog ¿cómo debería organizarse la consulta si necesito establecer 'where' como' A.id = B.id'? – Eugene

8
INSERT INTO dues_storage 
SELECT field1, field2, ..., fieldN, CURRENT_DATE() 
FROM dues 
WHERE id = 5; 
+0

hay tantos campos en la tabla, es hay un camino más corto? Si cambio la estructura de la tabla allí, tendría que recordar cambiar las páginas de php también. – user165242

+0

puede escapar con deudas. * – Zed

44

La forma más segura de hacerlo es especificar completamente las columnas tanto para la inserción como para la extracción. No hay garantía (para la aplicación) de que cualquiera de estos sea el orden que usted cree que pueden ser.

insert into dues_storage (f1, f2, f3, cd) 
    select f1, f2, f3, current_date() from dues where id = 5; 

Si estás preocupado por tener que cambiar muchas varias páginas PHP que hacen esto (como parece que indicar en el comentario a otra respuesta), esto es maduro para un procedimiento almacenado. De esta forma, todas sus páginas PHP simplemente llaman al procedimiento almacenado con (por ejemplo) solo la ID para copiar y controla el proceso de copia real. De esta forma, solo hay un lugar donde necesita mantener el código y, en mi opinión, el DBMS es el lugar adecuado para hacerlo.

+0

sí ... pero recién estoy comenzando. Ahora tengo que averiguar qué son los procedimientos almacenados, ¡gracias! una cosa más para aprender hoy! – user165242

4

Espero que esto ayude a alguien ... Aquí hay un pequeño script PHP que escribí en caso de que necesite copiar algunas columnas pero no otras, y/o las columnas no están en el mismo orden en ambas tablas. Siempre que las columnas tengan el mismo nombre, esto funcionará. Entonces, si la tabla A tiene [ID de usuario, manejar, algo] y la tabla B tiene [ID de usuario, manejar, marca de tiempo], entonces "SELECCIONAR ID de usuario, manejar, AHORA() como marca de tiempo DESDE la tabla A", luego obtener el resultado de eso, y pase el resultado como el primer parámetro a esta función ($ z). $ toTable es un nombre de cadena para la tabla en la que está copiando, y $ link_identifier es el db al que está copiando. Esto es relativamente rápido para pequeños conjuntos de datos. No se sugiere que intente mover más de unos miles filas a la vez de esta manera en un entorno de producción. Utilizo esto principalmente para hacer una copia de seguridad de los datos recopilados durante una sesión cuando un usuario cierra la sesión, y luego borro inmediatamente los datos de la base de datos en vivo para mantenerlo.

function mysql_multirow_copy($z,$toTable,$link_identifier) { 
      $fields = ""; 
      for ($i=0;$i<mysql_num_fields($z);$i++) { 
       if ($i>0) { 
        $fields .= ","; 
       } 
       $fields .= mysql_field_name($z,$i); 
      } 
      $q = "INSERT INTO $toTable ($fields) VALUES"; 
      $c = 0; 
      mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. ! 
      while ($a = mysql_fetch_assoc($z)) { 
       foreach ($a as $key=>$as) { 
        $a[$key] = addslashes($as); 
        next ($a); 
       } 
       if ($c>0) { 
        $q .= ","; 
       } 
       $q .= "('".implode(array_values($a),"','")."')"; 
       $c++; 
      } 
      $q .= ";"; 
      $z = mysql_query($q,$link_identifier); 
      return ($q); 
     } 
-4

Traté de lo que ha dicho, pero me sale un mensaje que dice que hay un problema con la cláusula where

esto es lo que he intentado:

INSERT INTO `seller` SELECT FROM `seller_test` WHERE 
`s_code`=11; 

error:

> #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
> near 'FROM `seller` WHERE `s_code`=11' at line 1 

pero cuando agregué el * después de la palabra clave SELECT y la consulta llegó a ser así:

INSERT INTO `seller` SELECT ***** FROM `seller_test` WHERE 
`s_code`=11; 

i obtener un buen resultado así que intenta añadir * después de la palabra clave SELECT

-2

sólo quería añadir este pequeño fragmento de código que funciona muy bien para mí.

INSERT INTO your_target_table SELECT * DE your_rescource_table donde id = 18;

Y mientras estoy en ello darle un saludo muy grande a Sequel Pro, si no lo está utilizando recomiendo descargarla ... hace la vida mucho más fácil

0

Como alternativa, puede utilizar Interior Consultas para hacerlo

SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>); 

Hope this helps!

Cuestiones relacionadas