2009-12-29 9 views
19

के भीतर एक स्क्रिप्ट शामिल करें मैं शामिल हूं एक परियोजना ओरेकल से MySQL तक माइग्रेट करने के लिए एक परियोजना है। ओरेकल में मेरे पास एक SQL स्क्रिप्ट बनाने की क्षमता है जो कमांड लाइन के माध्यम से बैच चलाए जाने पर अन्य बाहरी SQL स्क्रिप्ट फ़ाइलों को संदर्भित या उल्लिखित करता है। मैं एक स्क्रिप्ट CreateAllTables.sql कहा जाता है कि आंतरिक रूप से इस तरह दिखता है:MySQL स्क्रिप्ट

@tables\Site.sql 
@tables\Language.sql 
@tables\Country.sql 
@tables\Locale.sql 
@tables\Tag.sql 

मैं पहले से ही MySQL कमांड लाइन "स्रोत" आदेश के बारे में पता कर रहा हूँ, लेकिन मेरा लक्ष्य एक ही मुख्य .SQL स्क्रिप्ट फ़ाइल को लागू करने की है कि इस तरह एक ही कमांड लाइन कॉल के माध्यम से अन्य लिपियों में शामिल हैं:

mysql --user=root --password --database=junkdb -vv < CreateAllTables.sql 

तो मेरे सवाल का कैसे मैं MySQL के साथ ऐसा करते है?

उत्तर

22

source मेरे लिए काम करता है।

# -- foo.sql 
DROP TABLE foo; 
source bar.sql 

# -- bar.sql 
CREATE TABLE bar (i INT NOT NULL); 

$ mysql ... < foo.sql 

अब तालिका foo चला गया है और बार बनाई गई है।

+0

+1 दिलचस्प, मैंने देखा कि सभी उदाहरणों का सुझाव है कि यह केवल एक कमांड लाइन फ़ंक्शन था। मैं अभी भी MySQL के लिए बहुत नया हूँ। – James

+0

@ जेम्स, आप सही हैं, 'mysql (1)' मैन पेज दृढ़ता से सुझाव देता है कि यह केवल एक इंटरैक्टिव-मोड कमांड है। – pilcrow

+1

आप मदद mysql कमांड लाइन ग्राहक में कर सकते हैं, और ग्राहक (नहीं एसक्यूएल सर्वर कमांड, mysql कमांड लाइन आदेश) द्वारा समझा संभव आदेश देखें: MySQL उत्पादों के बारे में mysql> मदद जानकारी के लिए और सेवाएं, यात्रा करें: http://www.mysql.com/ MySQL संदर्भ मैनुअल सहित डेवलपर जानकारी के लिए, यहां जाएं: http://dev.mysql.com/ MySQL नेटवर्क समर्थन, प्रशिक्षण, या अन्य खरीदने के लिए उत्पाद, यात्रा: https://shop.mysql.com/ सभी MySQL आदेशों की सूची: एन ote कि सभी टेक्स्ट कमांड लाइन पर पहले और ';' के साथ अंत होना चाहिए ? (\?) 'मदद' के लिए समानार्थी। ... आदि ... –

7

आप mysql में स्रोत के साथ एक ही चीज़ कर सकते हैं।

मैं इन सामग्री के साथ inc1.sql है:

use test; 
create table testinc(
    id int 
); 

और इस तरह inc2.sql:

insert into testinc values (1); 

और इस तरह main.sql:

source inc1.sql 
source inc2.sql 

और मैं इस तरह main.sql चला सकते हैं:

mysql -uroot -pmysql -P3351 -e"Source main.sql" 

उसके बाद मैं पुष्टि कर सकते हैं कि यह ऐसा करने से काम किया: अगर स्क्रिप्ट एक mysql ग्राहक है कि समर्थन करता है के माध्यम से चलाया जाता है

mysql> use test; 
Database changed 
mysql> select * from testinc; 
+------+ 
| id | 
+------+ 
| 1 | 
+------+ 
1 row in set (0.00 sec) 
10

ध्यान दें कि "स्रोत" विकल्प, ऊपर, केवल (मेरे लिए) काम करता है यह।

(mysql कमांड लाइन ग्राहक ओ पी के मूल प्रश्न में संदर्भित उन ग्राहकों में से एक होता है।) लेकिन "स्रोत" याद नहीं एसक्यूएल भाषा के लिए कई mysql-विशेष विस्तारण से एक है। यह क्लाइंट कमांड है, एक एसक्यूएल स्टेटमेंट नहीं,

आपको परवाह क्यों है?

यदि आप अपनी एसक्यूएल स्क्रिप्ट को वैकल्पिक विधि के माध्यम से MySQL सर्वर पर भेज रहे हैं (उदाहरण के लिए जेडीबीसी के "execSQL" के माध्यम से) "स्रोत" कमांड अन्य स्क्रिप्ट को शामिल करने के लिए काम नहीं करेगा।

+1

यह सवाल का जवाब नहीं देता है। – David

+2

याहू, मुझे पता है। मैं स्वीकार किए गए उत्तर की टिप्पणी सूची में बस एक टिप्पणी जोड़ना पसंद करता। उस टिप्पणी धारा में कुछ भ्रम है और मैंने सोचा कि यह जानकारी स्पष्ट करने में मदद करेगी। लेकिन यह एक नया स्टैक ओवरफ्लो खाता है और मेरे पास अभी तक टिप्पणी करने के लिए पर्याप्त क्रेडिट नहीं है। (कम से कम मुझे लगता है कि यही कारण है कि मैं टिप्पणी नहीं कर सकता।)। इसलिए मैंने बस इसके बजाय एक नया "स्पष्टीकरण" उत्तर पोस्ट किया। क्षमा करें अगर यह अपमान करता है। –

+2

काफी मददगार; नियमों को झुकाव के लिए धन्यवाद। –