2011-12-21 18 views
9

बिना एक प्रवेश डुप्लिकेट करने के लिए मैं निम्न सिंटैक्स का उपयोग करना चाहते हैं:,Mysql: से * का चयन करें .... एक क्षेत्र

insert into TABLE select * from TABLE where ... 

हालांकि के रूप में पहले कॉलम एक स्वत: वेतन वृद्धि प्राथमिक कुंजी है, यह मूल्य अलग होना चाहिए। मेरा कामकाज तारों का उपयोग करने के बजाय चुनिंदा क्वेरी में सभी फ़ील्ड निर्दिष्ट करना था और फिर प्राथमिक कुंजी फ़ील्ड को खाली छोड़ना था। चूंकि मेरी तालिका में तीस से अधिक फ़ील्ड हैं जो दुर्भाग्य से बदलते रहते हैं, मैं एक ऐसे समाधान की तलाश में हूं जिसे मैं एक स्क्रिप्ट में कार्यान्वित कर सकता हूं और तालिका संरचना में बदलाव होने पर संशोधित करने की आवश्यकता नहीं है। कोई विचार? आपका बहुत बहुत धन्यवाद!

+2

दुर्भाग्य से, वहाँ वास्तव में एक और तरीका है। मेरा प्रश्न देखें [चयन * EXCEPT] (http://stackoverflow.com/questions/413819/select-except) जो एक समान नस में है। –

उत्तर

1

MySQL इस तरह के फ़ील्ड को खत्म करने का कोई तरीका प्रदान नहीं करता है। हालांकि, अगर आपको पता है कि आप हमेशा सभी फ़ील्ड चाहते हैं लेकिन प्राथमिक कुंजी, तो प्राथमिक कुंजी को लाने के लिए वास्तव में बहुत अधिक ओवरहेड नहीं है। आपके कोड में प्राथमिक कुंजी को बाहर करना बहुत आसान होगा।

यदि यह प्राप्त करना वाकई महत्वपूर्ण है, तो आप स्तंभों की सूची प्राप्त करने के लिए DESCRIBE TABLE निष्पादित कर सकते हैं और फिर अपनी क्वेरी बना सकते हैं। हालांकि, यह संभवतः चीजों को और अधिक जटिल बनाने की संभावना है। मैं केवल प्राथमिक कुंजी को अनदेखा करने की सलाह दूंगा।

4

उदाहरण:

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> 

अब आप ही तैयार करने और निष्पादित करने के लिए है ..

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

mysql> execute stmt; 
Empty set (0.00 sec) 

कोई पंक्ति नहीं है क्योंकि पंक्तियाँ तालिका में डाला है नहीं है लौट आए।

और अब डालने और फिर से क्रियान्वित ..

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) 

वापसी 'आईडी' की @sql में निर्दिष्ट के अलावा सभी तालिका क्षेत्रों

+0

'गतिशील एसक्यूएल' ftw! –

संबंधित मुद्दे