2011-12-21 9 views
9

.... olmadan SELECT *: birinci sütun, otomatik olarak artan bir birincil anahtar olarak, ancakMySQL: Aşağıdaki sözdizimini kullanmak isteyen bir giriş çoğaltma için bir alan

insert into TABLE select * from TABLE where ... 

bu değer farklı olmalıdır. Benim geçici çözüm, yıldız işaretini kullanmak yerine ve sonra birincil anahtar alanı boş bırakarak seçme sorgusundaki tüm alanları belirtmekti. Masamda maalesef değişmeyen otuzdan fazla alan bulunduğundan, bir senaryoda gerçekleştirebileceğim ve tablo yapısı değiştiğinde değiştirilmesi gerekmeyen bir çözüm arıyorum. Herhangi bir fikir? Çok teşekkür ederim!

+2

Maalesef gerçekten başka yolu yoktur @ sql belirtilen 'ID' hariç tüm tablo alanlar. Benzer bir damardaki [SELECT * EXCEPT] (http://stackoverflow.com/questions/413819/select-except) sorumu görün. –

cevap

1

MySQL, bu gibi alanları ortadan kaldırmanın bir yolunu sağlamaz. Ancak, her zaman tüm alanları ancak birincil anahtarı istediğinizi biliyorsanız, o zaman birincil anahtarı almak için gerçekten fazla masraf yoktur. Ana anahtarı kodunuzda hariç tutmak çok daha kolay olacaktır.

Bunu elde etmek gerçekten önemliyse, sütunların listesini almak ve ardından sorgunuzu oluşturmak için DESCRIBE TABLE kodunu çalıştırabilirsiniz. Ancak, bu muhtemelen sadece işleri çok daha karmaşık hale getirmektedir. Sadece birincil anahtarı dikkate almamanızı tavsiye ederim.

4

Örnek:

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> 

Şimdi

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

mysql> execute stmt; 
Empty set (0.00 sec) 

satır yok çünkü satırlar tabloya ekledikten yok döndürülen .. sadece hazırlamak ve yürütmek zorundayız.

Ve şimdi ekleme ve yeniden yürütme ..

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) 

Dönüş

+0

'Dinamik SQL' ftw! –

İlgili konular