2011-12-21 18 views
9

Per duplicare una voce Vorrei utilizzare la seguente sintassi:Mysql: SELECT * FROM .... senza un campo

insert into TABLE select * from TABLE where ... 

Tuttavia, come la prima colonna è una chiave primaria di incremento automatico, questo il valore deve essere diverso La mia soluzione alternativa era quella di specificare tutti i campi nella query di selezione anziché utilizzare l'asterisco e lasciare vuoto il campo della chiave primaria. Dato che la mia tabella ha più di trenta campi che purtroppo continuano a cambiare, sto cercando una soluzione che possa essere implementata in uno script e che non debba essere modificata quando la struttura della tabella cambia. Qualche idea? Grazie mille!

+2

Purtroppo, non c'è davvero un altro modo. Vedi la mia domanda [SELEZIONA * ECCETTO] (http://stackoverflow.com/questions/413819/select-except) che è allo stesso modo. –

risposta

1

MySQL non fornisce un modo per eliminare campi come questo. Tuttavia, se sai che vuoi sempre tutti i campi, ma la chiave primaria, allora non c'è davvero molto da fare per recuperare anche la chiave primaria. Sarà molto più semplice escludere la chiave primaria nel codice.

Se è davvero importante ottenere questo, è possibile eseguire DESCRIBE TABLE per ottenere un elenco di colonne e quindi costruire la query. Tuttavia, questo è probabilmente solo per rendere le cose molto più complicate. Vorrei consigliare semplicemente ignorando la chiave primaria.

4

Esempio:

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> 

Ora si hanno solo per preparare ed eseguire ..

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

mysql> execute stmt; 
Empty set (0.00 sec) 

Nessuna riga restituito perché non hanno righe inserite nella tabella.

E ora l'inserimento e l'esecuzione di nuovo ..

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) 

ritorno tutti i campi della tabella, ad eccezione 'ID' di specificato nel @sql

+0

'SQL dinamico' ftw! –