2017-05-22 57 views
15

我有一個Excel電子表格.SQL:如何導入.xls文件與外鍵

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

,我有其中有region_idzone_id,而不是MySQL數據庫它們是外鍵ID在區域表和區域。

用戶表:

id name region_id zone_id 
1 retre 1  1 
... 

區表:

id region_name 
1 Polon 
... 

區表

id zone_name 
1 kinta 
... 

我需要將Excel電子表格導入到用戶表中。

回答

3

我建議在您的.xls表中,將區域名稱和區域名稱替換爲數據庫上實際的id,以表示這些字段。然後,您可以將您的XLS文件導出爲CSV文件,然後輕鬆地導入到使用mysqlimport

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

幾件事情需要考慮你的數據庫:

  1. 來當你的文件的路徑執行命令。
  2. 以字符結尾的字符
  3. 「-p DatabaseName」,DatabaseName不是密碼,是您的數據庫名稱,執行命令時會提示您輸入密碼。

你可以導入CSV使用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; 

此外,如果你正在使用任何圖形MySQL客戶端(MySQL工作臺,heideSql,mysqlpro等),您可以使用導入功能的SQL語句文件代替。

+1

我在表中有超過5000條記錄。用id替換區域和區域名稱非常繁瑣。 – Steve

+2

@Steve - 大約需要4條SQL語句,沒有循環,沒有手動工作: CREATE TABLE mapping ... SELECT DISTINCT zone ...'然後添加一個id列,'UPDATE real JOIN mapping ON ... SET real.id = mapping.id WHERE real.zone = mapping.zone'。然後'DROP COLUMN區域'。如果你願意,我們可以討論如何處理後續的LOADs。 –

+1

同意@Rick James對此。如果您將映射表和id映射列設置爲石頭,那麼使用新列和更新應該很容易。 –

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; 

如果idAUTO_INCREMENT,那麼你可能會想稍微改變一下。 (請在INSERTSELECT之間留下id。)

我使用了LEFT以防萬一有一些缺失的區域或分區。在這種情況下,您將獲得NULLsregion_idzone_id的默認值,從而表明需要修復某些內容。

+0

它應該是'r.region_name = X.region'和'z.zone_name = X.zone' –

2

假設這些表都不存在,請首先創建三個CSV文件users.csv,regions.csv,zone.csv。

regions.csv和zones.csv將有一個您可以導入到數據庫中的列是region_name或zone_name。我假設這些表將與AUTO_INCREMENT設置,所以ID值將自己照顧。

要在Excel中創建這些文件,請使用「數據」>「刪除重複項」來獲取不同的值。如果您有權訪問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): 

事情是這樣的:

INSERT INTO用戶 (ID,姓名,REGION_ID,zone_id) SELECT tempUsers.id,tempUsers.name,region.id,zone.id 從X LEFT加入區域AS區域ON region.region_name = tempUsers.region LEFT JOIN區域AS區域ON zone.zone_name = tempUsers.zone;

如果id是一個AUTO_INCREMENT,那麼您可能需要略微不同。 (離開id列的INSERT和SELECT的。因爲AUTO_INCREMENT會使行數得到增加1每當新的記錄進入)

快樂編程

1

通常這是我做。

創建excel公式以生成插入腳本。 Id是一個自動生成,所以只需跳過它。 假設你的ID在A單元格中,分別命名爲C單元格和D單元格中的B單元格,區域和區域。

="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

對於重複需求,可以在Excel中映射外鍵。 將區域表和區域表導出到Excel文件。 像(例如:文件名:lookupmaster.xlsx)

region name region Id 
Polon   1 
yerni   2 

與實際數據的電子表格,使用VLOOKUP

VLOOKUP(B2,[lookumaster.xlsx]Sheet1!$A$1:$B$4,2,FALSE) 
添加兩列

region_id, zone_id 

獲取區域ID爲所有行

刪除對主,鍵列的依賴關係, 複製區域Id列和粘貼專用值只有在它的地方。

重複的區域ID

你可以從你的電子表格中刪除區域和區域列,並將其導入到數據庫中的相同。