2008-10-23 15 views
13

Quiero copiar todas las columnas de una fila, pero no tengo que especificar cada columna. Soy consciente de la sintaxis en http://dev.mysql.com/doc/refman/5.1/en/insert-select.html pero no veo forma de ignorar una columna.Copiando filas en MySQL

Para mi ejemplo, estoy tratando de copiar todas las columnas de una fila a una nueva fila, a excepción de la clave principal.

¿Hay alguna manera de hacerlo sin tener que escribir la consulta en cada campo que contiene?

Respuesta

3

Deberá enumerar las columnas que desea seleccionar si no las está seleccionando todas. Copiar/Pegar es tu amigo.

1

Si no especifica las columnas, debe mantener las entradas en orden. Por ejemplo:

INSERT INTO `users` (`ID`, `Email`, `UserName`) VALUES 
(1, '[email protected]', 'StackOverflow') 

funcionaría pero

INSERT INTO `users` VALUES 
('[email protected]', 'StackOverflow') 

colocaría el correo electrónico en la columna ID de modo que no es bueno.

intentar escribir las columnas una vez como:

INSERT INTO `users` (`Email`, `UserName`) VALUES 
('[email protected]', 'StackOverflow'), 
('[email protected]', 'StackOverflow2'), 
('[email protected]', 'StackOverflow3'), 
etc... 

Creo que hay un límite para el número de filas puede insertar con ese método sin embargo.

+0

Hasta donde yo sé, el único límite en el número de filas que puede insertar con ese método es el tamaño del paquete MySQL. –

+0

genial. bueno saber; gracias a Dominic –

1

No, esto no es posible.

Pero es fácil de obtener la lista de columnas y simplemente eliminar la que uno no desea copiar este proceso también se puede hacer a través de código, etc.

0

Estoy asumiendo que ya desea omitir la clave primaria que es una columna auto_increment y desea que MySQL genere automáticamente el siguiente valor de la secuencia.

Teniendo en cuenta que, en el supuesto de que usted no tiene que hacer inserciones masivas a través de la inserción en ... elegir entre método, el siguiente trabajo para las inserciones única/múltiple de registro:

inserción en mitabla (null, ' a B C');

Donde la primera columna es su clave primaria auto_incremented y las otras son sus otras columnas en la tabla. Cuando MySQL ve un nulo (o 0) para una columna auto_incremented, reemplazará automáticamente el valor nulo con el siguiente valor válido (consulte this link para obtener más información). Esta funcionalidad se puede desactivar deshabilitando el modo sql NO_AUTO_VALUE_ON_ZERO descrito en ese enlace.

Avíseme si tiene alguna pregunta.

-Dipin

+0

"Quiero copiar todas las columnas de una fila, PERO NO DEBO ESPECIFICAR CADA COLUMNA"? – haknick

+0

Cuando se trata de insertar instrucciones en SQL, la lista de nombres de columna es la parte que viene antes de la palabra clave VALUES. Dado que trabajo con SQL, tomé la pregunta en el sentido de que OP deseaba evitar tener que enumerar los nombres de las columnas y no quería evitar especificar el * valor * de cada columna también (que, como se señaló por otros, no es posible ya que sería similar a alguien que intenta almacenar un valor en una variable en otro idioma sin escribir realmente la declaración de asignación). – Dipin

15

Si su id o columna de clave principal es un auto_increment puede utilizar una tabla temporal:

CREATE TEMPORARY TABLE temp_table 
AS 
SELECT * FROM source_table WHERE id='7'; 
UPDATE temp_table SET id='100' WHERE id='7'; 
INSERT INTO source_table SELECT * FROM temp_table; 
DROP TEMPORARY TABLE temp_table; 

por lo que en esta forma se puede copiar todos los datos en la fila de id = '7' y luego asigne nuevo valor '100' (o cualquier valor que caiga por encima del rango de su valor actual de auto_increment en source_table).

Editar: Mente la; después de las declaraciones :)

+1

Gracias, funciona como un encanto. Para cualquier otra persona que intente hacer esto con php, recuerde que cada instrucción sql tiene que ir como una sola 'mysql_query()' – kontur

+7

Establecer 'id' a cero también funciona. En 'INSERT', se inserta una columna' auto_increment' con el valor '0' como cualquiera que sea el siguiente valor. – TRiG

+0

Funciona mejor como una rutina almacenada. –

2

Este es un script PHP que escribí para hacer esto, supondrá que su primer col es su incremento automático.

$sql = "SELECT * FROM table_name LIMIT 1"; 
$res = mysql_query($sql) or die(mysql_error()); 
for ($i = 1; $i < mysql_num_fields($res); $i++) { 
    $col_names .= mysql_field_name($res, $i).", "; 
} 
$col_names = substr($col_names, 0, -2); 

$sql = "INSERT INTO table_name (".$col_names.") SELECT ".$col_names." FROM table_name WHERE condition "; 
$res = mysql_query($sql) or die(mysql_error()); 
1

Copie la tabla en una nueva, luego elimine la columna que no desea. Sencillo.