2017-05-22 13 views
15

मैं एक एक्सेल स्प्रेडशीट के साथ .sql को .xls फ़ाइल आयात करने के लिए कैसे:एक विदेशी कुंजी

id name region zone 
1 pokin Polon Riny 
2 lucy yerni kinta 
... 

और मैं mysql डेटाबेस जो region_id और zone_id बजाय है में तालिकाओं जो इस क्षेत्र में आईडी के लिए विदेशी कुंजी हैं और इसके बजाय क्षेत्र।

उपयोगकर्ताओं तालिका:

id name region_id zone_id 
1 retre 1  1 
... 

क्षेत्र तालिका:

id region_name 
1 Polon 
... 

और क्षेत्र तालिका

id zone_name 
1 kinta 
... 

मैं करने की जरूरत है उपयोगकर्ता तालिका में एक्सेल स्प्रेडशीट आयात करें।

उत्तर

3

मेरा सुझाव है कि आपके .xls शीट में, उन क्षेत्रों के लिए डेटाबेस पर वास्तविक आईडी के साथ ज़ोन और क्षेत्र के नामों को प्रतिस्थापित करें। तो फिर तुम एक csv फ़ाइल में अपने xls फ़ाइल निर्यात कर सकते हैं, और फिर आसानी से आयात कि अपने डेटाबेस mysqlimport

mysqlimport --ignore-lines=1 \ 
     --fields-terminated-by=, \ 
     --local -u root \ 
     -p DatabaseName \ 
     YourExportedFile.csv 

कुछ बातें का उपयोग कर यहाँ पर विचार करने में:

  1. पथ फ़ाइल जब आप कर रहे हैं करने के लिए आदेश निष्पादित करना
  2. फ़ाइल्स-टर्मिनेट-बाय कैरेक्टर
  3. "-p डेटाबेस नाम", डेटाबेस नाम पासवर्ड नहीं है, आपका डेटाबेस नाम है, जब आप कमांड निष्पादित करते हैं तो पासवर्ड संकेत दिया जाएगा।

आप अपनी CSV एक एसक्यूएल बयान इसके अतिरिक्त यदि आप (, mysqlpro mysql कार्यक्षेत्र, heideSql, आदि) किसी भी चित्रमय MySQL ग्राहक का उपयोग कर रहे LOAD DATA INFILE

LOAD DATA INFILE "/home/user/YourExportedFile.csv" 
INTO TABLE YOUR_TABLE 
COLUMNS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
ESCAPED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES; 

का उपयोग कर आप आयात कार्यक्षमता का उपयोग कर सकते हैं के साथ फ़ाइल आयात कर सकता है बजाय।

+1

मेरे पास तालिका में 5000+ रिकॉर्ड हैं। आईडी के साथ क्षेत्र और क्षेत्र का नाम बदलना बहुत कठिन है। – Steve

+2

@Steve - इसमें लगभग 4 एसक्यूएल कथन, कोई लूप नहीं, कोई मैन्युअल काम नहीं होता है: 'तालिका मैपिंग बनाएं ... डिस्टिंट ज़ोन चुनें ...' फिर एक आईडी कॉलम जोड़ें, 'असली जॉइन मैपिंग अपडेट करें ... सेट करें real.id = mapping.id जहां real.zone = mapping.zone'। फिर 'ड्रोप कॉलम जोन'। यदि आप चाहें तो हम बाद के 'लोड' से निपटने के तरीके पर चर्चा कर सकते हैं। –

+1

इस पर @ रिक जेम्स के साथ सहमत हैं। नए कॉलम के साथ यह आसान होना चाहिए और यदि आपके पास पत्थर में मैपिंग टेबल और आईडी मैपिंग कॉलम सेट है तो अपडेट करें। –

11
  1. तालिका को निर्यात करें जैसा कि आप इसे स्प्रेडशीट में दिखाते हैं (वर्तनी वाले नामों के साथ)।
  2. MySQL में आयात करें - तालिका X में, कहें।
  3. (नाम के बजाय संख्या के साथ) "सामान्य" करने के लिए के रूप में आप इच्छित तालिका बनाने के निम्न क्वेरी करें:

कुछ इस तरह:

INSERT INTO users 
     (id, name, region_id, zone_id) 
    SELECT X.id, X.name, r.id, z.id 
     FROM X 
     LEFT JOIN region AS r ON r.region_name = X.name 
     LEFT JOIN zone AS z ON z.zone_name = X.name; 

तो id एक AUTO_INCREMENT है, तो आप इसे थोड़ा अलग करना चाह सकते हैं। (INSERT और SELECT से बाहर id छोड़ दें।)

मैं मामले में LEFT इस्तेमाल किया कुछ याद आ रही क्षेत्रों या zoned देखते हैं।इस मामले में, आपको NULLs या region_id या zone_id के लिए डिफ़ॉल्ट मान मिलेगा, जिससे संकेत मिलता है कि कुछ को ठीक करने की आवश्यकता है।

+0

यह 'r.region_name = X.region' और' z.zone_name = X.zone' होना चाहिए –

2

मान लें कि इनमें से कोई भी तालिका मौजूद नहीं है, पहले तीन सीएसवी फाइल उपयोगकर्ता.csv, regions.csv, zone.csv बनाएं।

regions.csv और zones.csv में एक एकल कॉलम होगा जिसे आप डीबी में आयात कर सकते हैं क्षेत्र_नाम या zone_name है। मुझे लगता है कि टेबल AUTO_INCREMENT के साथ स्थापित किए जाएंगे, इसलिए आईडी मान स्वयं का ख्याल रखेंगे।

एक्सेल में इन फ़ाइलों को बनाने के लिए डेटा> डुप्लिकेट निकालें का उपयोग करके अलग-अलग मान प्राप्त करें। यदि आपके पास डेटाबेस में phpMyAdmin आयात फ़ाइलों जैसे कुछ तक पहुंच है, तो इन दो तालिकाओं को आयात करें।

बनाना उपयोगकर्ता:

नाम, क्षेत्रों, क्षेत्र, region_id zone_id

आप में आपकी मूल फ़ाइल आयात कर सकते हैं: उन तालिका में विदेशी कुंजी हो रही के लिए, मैं के साथ उपयोगकर्ताओं को तालिका बनाने होगा नाम, क्षेत्र, क्षेत्र फ़ील्ड, फिर विदेशी कुंजी अपडेट करें।

UPDATE users as u SET region_id = (SELECT id FROM regions as r WHERE r.region_name = u.region) 

फिर बस क्षेत्र और क्षेत्र कॉलम ड्रॉप करें।

1
First we need to bring the spreadsheet in the table format in MySQL by using Export/Import feature 

Export the table as you show it in the spreadsheet (with spelled out names). 
Import that into MySQL - into table tempUsers, say. 
Perform the following query to do the "normalization" as you create the desired table (with numbers instead of names): 

कुछ इस तरह:

उपयोगकर्ताओं में डालने (आईडी, नाम, region_id, zone_id) चयन tempUsers.id, tempUsers.name, region.id, से एक्स वाम zone.id जॉइन क्षेत्र एएस क्षेत्र पर क्षेत्र.region_name = tempUsers.region बाएं जॉइन जोन एएस जोन z.zone_name = tempUsers.zone पर;

यदि आईडी एक ऑटोमेशन है, तो आप इसे थोड़ा अलग तरीके से करना चाहेंगे। (सम्मिलित करें और चयन से बाहर आईडी छोड़ दें। जब भी नया रिकॉर्ड में प्रवेश करती है क्योंकि AUTO_INCREMENT rowcount कर देगा 1 की वृद्धि करने के लिए)

मुबारक प्रोग्रामिंग

1

आम तौर पर यह क्या है मैं करो

सम्मिलित स्क्रिप्ट उत्पन्न करने के लिए एक्सेल सूत्र बनाएं। आईडी एक ऑटो जेनरेट होगा इसलिए इसे छोड़ दें। आपकी आईडी मानना ​​एक सेल में है, क्रमशः सी और डी में बी सेल, क्षेत्र और क्षेत्र में नाम है।

="INSERT INTO USER_TABLE(NAME, REGION_ID, ZONE_ID) VALUES ('"&B1&"',(select id 
from region where region_name = '"&C1&"'), (select id from zone where 
zone_name = '"&D1&"')"; 

के बाद 1 खींचें सूत्र बनाने के अंत पंक्तियों के लिए नीचे, स्क्रिप्ट को कॉपी करें और निष्पादित करें।

बातें मैं विचार:

  1. पर्यावरण, स्थानीय, एसआईटी, UAT, उत्पादन शायद का एक बहुत में पैच करने के लिए की आवश्यकता है। मुझे उत्पादन वातावरण में कोई डीबी पहुंच नहीं मिली है इसलिए लिपि डालने का सबसे अच्छा तरीका है।
  2. अगली बार को नए कॉलम के साथ आवश्यक मामले में बदलने के लिए बहुत सी चीजें शामिल नहीं हैं और आसानी से बदलना आसान नहीं है।
1

बार-बार आवश्यकता के लिए, एक्सेल में विदेशी कुंजी मैप की जा सकती है। एक्सेल फ़ाइल में क्षेत्र तालिका और क्षेत्र तालिका निर्यात करें। की तरह (पूर्व: फ़ाइल नाम: lookupmaster.xlsx)

region name region Id 
Polon   1 
yerni   2 

वास्तविक डेटा के साथ स्प्रेडशीट में,

VLOOKUP(B2,[lookumaster.xlsx]Sheet1!$A$1:$B$4,2,FALSE) 
VLOOKUP का उपयोग कर के रूप में

region_id, zone_id 

सभी पंक्तियों के लिए क्षेत्र क्रमांक जाओ दो स्तंभ जोड़ने

मास्टर पर निर्भरता को हटाने के लिए, कुंजी कॉलम, प्रतिलिपि क्षेत्र आईडी कॉलम और मानों के रूप में विशेष पेस्ट करें केवल अपनी जगह में।

दोहराएँ क्षेत्र क्रमांक

आप स्प्रेडशीट से क्षेत्र और क्षेत्र कॉलम हटाकर डेटाबेस के लिए आयात कर सकता है के लिए एक ही।

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