2011-12-21 15 views
9

Dla powielenie wpisu chciałbym użyć następującej składni:MySQL: SELECT * FROM .... bez jednej dziedzinie

insert into TABLE select * from TABLE where ... 

Jednak jako pierwsza kolumna jest kluczem podstawowym automatycznego przyrostu, to wartość musi być inna. Moim obejściem było określenie wszystkich pól w kwerendzie wyboru zamiast użycia gwiazdki, a następnie pozostawienie pola klucza podstawowego pustym. Ponieważ mój stół zawiera ponad trzydzieści pól, które niestety ciągle się zmieniają, szukam rozwiązania, które mogę wdrożyć w skrypcie i którego nie trzeba modyfikować, gdy zmienia się struktura tabeli. Jakieś pomysły? Dziękuję Ci bardzo!

+2

Niestety, nie ma naprawdę inny sposób. Zobacz moje pytanie [SELECT * EXCEPT] (http://stackoverflow.com/questions/413819/select-except), które jest w podobnym duchu. –

Odpowiedz

1

MySQL nie zapewnia sposobu na wyeliminowanie takich pól. Jeśli jednak wiesz, że zawsze będziesz potrzebować wszystkich pól, ale klucz podstawowy, to naprawdę nie ma zbyt wiele do pobrania klucza podstawowego. Znacznie łatwiej będzie wykluczyć klucz podstawowy z kodu.

Jeśli to naprawdę ważne, aby to uzyskać, można wykonać DESCRIBE TABLE, aby uzyskać listę kolumn, a następnie skonstruować zapytanie. Jednak najprawdopodobniej sprawi to, że sprawy będą dużo bardziej skomplikowane. Radziłbym po prostu ignorować klucz podstawowy.

4

Przykład:

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> 

Teraz trzeba tylko przygotować i wykonać ..

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

mysql> execute stmt; 
Empty set (0.00 sec) 

Brak wierszy zwracanych ponieważ nie zostały wiersze umieszczone w tabeli.

A teraz wkładania i wykonując ponownie ..

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) 

Powrót wszystkie pola tabeli, z wyjątkiem „ID” z określonym w @sql

+0

'Dynamiczny SQL' ftw! –

Powiązane problemy