2011-12-21 22 views
9

Para duplicar una entrada me gustaría usar la siguiente sintaxis:MySQL: SELECT * FROM .... sin un campo

insert into TABLE select * from TABLE where ... 

Sin embargo, como la primera columna es una clave principal incremento automático, este el valor debe ser diferente. Mi solución fue especificar todos los campos en la consulta de selección en lugar de utilizar el asterisco y luego dejar en blanco el campo de la clave principal. Como mi tabla tiene más de treinta campos que lamentablemente siguen cambiando, estoy buscando una solución que pueda implementar en un script y que no necesite modificarse cuando cambie la estructura de la tabla. ¿Algunas ideas? ¡Muchas gracias!

+2

Por desgracia, no hay realmente otra manera. Ver mi pregunta [SELECCIONAR * EXCEPTO] (http://stackoverflow.com/questions/413819/select-except) que está en una línea similar. –

Respuesta

1

MySQL no proporciona una forma de eliminar campos como este. Sin embargo, si sabes que siempre querrás todos los campos excepto la clave principal, tampoco hay mucha sobrecarga para recuperar la clave primaria. Será mucho más fácil excluir la clave principal en su código.

Si es realmente importante obtener esto, puede ejecutar DESCRIBE TABLE para obtener una lista de columnas y luego construir su consulta. Sin embargo, esto es probable que haga las cosas mucho más complicadas. Aconsejaría ignorar la clave principal.

4

Ejemplo:

mysql> create database dbase; 
Query OK, 1 row affected (0.00 sec) 

mysql> use dbase; 
Database changed 
mysql> create table tbl (id integer not null primary key auto_increment, field2 integer, field3 integer); 
Query OK, 0 rows affected (0.04 sec) 

mysql> SET @sql = CONCAT ('SELECT ' , (SELECT REPLACE (GROUP_CONCAT(COLUMN_NAME) , 'id,' , '') FROM INFORMATION_SCHEMA.COLUMNS WHERE T 
ABLE_NAME = 'tbl' AND TABLE_SCHEMA = 'dbase'), ' FROM tbl'); 
Query OK, 0 rows affected (0.01 sec) 

mysql> select @sql; 
+-------------------------------+ 
| @sql       | 
+-------------------------------+ 
| SELECT field2,field3 FROM tbl | 
+-------------------------------+ 
1 row in set (0.00 sec) 

mysql> 

Ahora sólo tienen que preparar y ejecutar ..

mysql> prepare stmt from @sql; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

mysql> execute stmt; 
Empty set (0.00 sec) 

No hay filas devueltas porque no se han insertado filas en la tabla.

Y ahora insertar y ejecutar de nuevo ..

mysql> insert into tbl (field2, field3) values (1 , 2) , (3 , 4) ; 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> execute stmt; 
+--------+--------+ 
| field2 | field3 | 
+--------+--------+ 
|  1 |  2 | 
|  3 |  4 | 
+--------+--------+ 
2 rows in set (0.00 sec) 

Volver todos los campos de la tabla, excepto 'ID' de la especificada en @sql

+0

'Dynamic SQL' ftw! –

Cuestiones relacionadas