tutorial - MYSQL: ¿Cómo copiar una fila completa de una tabla a otra en mysql con la segunda tabla con una columna extra?
mysql versiones (8)
Tengo dos tablas con una estructura idéntica, excepto una columna ... La Tabla 2 tiene esa columna adicional en la que insertaría el CURRENT_DATE ()
Me gustaría copiar todos los valores de table1 a table2.
si uso
INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;
arroja un error que señala la diferencia en el número de columnas.
Tengo dos preguntas sobre eso:
- ¿Cómo puedo evitar esto?
- y ¿cómo agrego el valor para la columna de fecha adicional (CURRENT_DATE ()) en la tabla 2 dentro de esta misma declaración?
Alternativamente, puede usar las consultas internas para hacerlo.
SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);
¡Espero que esto ayude!
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);
}
Intenté lo que dijiste pero recibí un mensaje que decía que había un problema con la cláusula where
esto es lo que intenté:
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 se convirtió así:
INSERT INTO `seller` SELECT ***** FROM `seller_test` WHERE
`s_code`=11;
obtengo un buen resultado así que intento agregar * después de la palabra clave SELECT
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 le preocupa tener que cambiar muchas páginas múltiples de PHP que hacen esto (como parece indicar en el comentario a otra respuesta), está listo 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.
Para refinar la respuesta de Zed, y para responder su comentario:
INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;
Ver el comentario de TJ Crowder
Solo quería agregar este pequeño fragmento que funciona maravillosamente para mí.
INSERT INTO your_target_table SELECT * FROM your_rescource_table WHERE id = 18;
Y mientras estoy en ello le doy un gran grito a Sequel Pro, si no lo está usando, recomiendo descargarlo ... hace la vida mucho más fácil
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
SET @sql =
CONCAT( ''INSERT INTO <table_name> ('',
(
SELECT GROUP_CONCAT( CONCAT(''`'',COLUMN_NAME,''`'') )
FROM information_schema.columns
WHERE table_schema = <database_name>
AND table_name = <table_name>
AND column_name NOT IN (''id'')
), '') SELECT '',
(
SELECT GROUP_CONCAT(CONCAT(''`'',COLUMN_NAME,''`''))
FROM information_schema.columns
WHERE table_schema = <database_name>
AND table_name = <table_source_name>
AND column_name NOT IN (''id'')
),'' from <table_source_name> WHERE <testcolumn> = <testvalue>'' );
PREPARE stmt1 FROM @sql;
execute stmt1;
Por supuesto, reemplace los valores <> con valores reales y observe sus cotizaciones.