2017-05-22 21 views
15

Tôi có một bảng tính excel nước ngoài:Làm thế nào để nhập tập tin .xls để sql với một chìa khóa

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

Và tôi có bảng trong cơ sở dữ liệu mysql trong đó có region_idzone_id thay vì đó là chìa khóa nước ngoài id trong khu vực và vùng thay thế.

người dùng bảng:

id name region_id zone_id 
1 retre 1  1 
... 

khu vực bảng:

id region_name 
1 Polon 
... 

bảng khu

id zone_name 
1 kinta 
... 

tôi cần phải nhập bảng tính excel vào bảng người dùng.

Trả lời

3

Tôi đề xuất rằng trong trang .xls của bạn, hãy thay thế tên khu vực và khu vực bằng các id thực trên cơ sở dữ liệu cho các trường đó. Sau đó, bạn có thể xuất file xls của bạn vào một tập tin csv, và sau đó dễ dàng nhập đó vào cơ sở dữ liệu bằng cách sử dụng mysqlimport

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

Một vài điều cần xem xét ở đây:

  1. Đường dẫn đến tập tin khi bạn đang thực hiện lệnh.
  2. Ký tự kết thúc theo ký tự
  3. "-p DatabaseName", Tên cơ sở dữ liệu không phải là mật khẩu, là tên cơ sở dữ liệu của bạn, mật khẩu sẽ được nhắc khi bạn thực hiện lệnh.

Bạn có thể nhập khẩu tập tin với một câu lệnh SQL sử dụng 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; 

Ngoài ra nếu bạn đang sử dụng bất kỳ khách hàng MySQL đồ họa (workbench mysql, heideSql, mysqlpro, vv), bạn có thể sử dụng các chức năng nhập CSV của bạn thay thế.

+1

tôi có hơn 5000 bản ghi trong bảng. thay thế tên vùng và khu vực bằng id rất tẻ nhạt. – Steve

+2

@Steve - Phải mất khoảng 4 câu lệnh SQL, không có vòng lặp, không có công việc thủ công: 'TẠO TABLE mapping ... SELECT DISTINCT zone ...' rồi thêm một cột id, 'UPDATE real JOIN mapping ON ... SET real.id = mapping.id WHERE real.zone = mapping.zone'. Sau đó, 'DROP COLUMN zone'. Chúng ta có thể thảo luận cách xử lý 'LOADs' tiếp theo nếu bạn muốn. –

+1

đồng ý với @Rick James về điều này. Nó sẽ dễ dàng với cột mới và cập nhật nếu bạn có bảng ánh xạ và cột lập bản đồ id được đặt trong đá. –

11
  1. Xuất bảng khi bạn hiển thị bảng trong bảng tính (với tên viết tắt).
  2. Nhập khẩu vào MySQL - thành bảng X, nói.
  3. Thực hiện các truy vấn sau đây để làm "bình thường" khi bạn tạo bảng mong muốn (với số thay vì tên):

Something như thế này:

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; 

Nếu id là một AUTO_INCREMENT, sau đó bạn có thể muốn làm điều đó hơi khác nhau. (Để lại id ra khỏi số INSERTSELECT.)

Tôi đã sử dụng LEFT trong trường hợp có một số vùng hoặc vùng bị thiếu.Trong trường hợp này, bạn sẽ nhận được NULLs hoặc các giá trị mặc định cho region_id hoặc zone_id, do đó cho biết rằng cần phải sửa chữa.

+0

Nó phải là 'r.region_name = X.region' và' z.zone_name = X.zone' –

2

Giả sử không có bảng nào trong số này tồn tại, trước tiên hãy tạo ba tệp CSV users.csv, regions.csv, zone.csv.

regions.csv và zones.csv sẽ có một cột mà bạn có thể nhập vào DB là region_name hoặc zone_name. Tôi giả sử các bảng sẽ được thiết lập với AUTO_INCREMENT để các giá trị id sẽ tự chăm sóc bản thân.

Để tạo các tệp này trong Excel, hãy nhận các giá trị khác biệt bằng cách sử dụng Dữ liệu> Xóa các mục trùng lặp. Nếu bạn có quyền truy cập vào một cái gì đó như phpMyAdmin nhập tệp vào cơ sở dữ liệu, sau đó nhập hai bảng này.

người dùng Tạo: Để nhận được các phím nước ngoài vào bảng người dùng, tôi sẽ tạo ra bảng cho người dùng với:

tên, khu vực, vùng, region_id, zone_id

Bạn có thể nhập tập tin gốc của bạn vào tên, khu vực, các trường vùng, sau đó cập nhật các khóa ngoại.

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

Sau đó, chỉ cần thả các cột khu vực và khu vực.

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): 

Something như thế này:

INSERT INTO người dùng (id, name, region_id, zone_id) CHỌN tempUsers.id, tempUsers.name, region.id, zone.id TỪ X LEFT JOIN khu vực AS khu vực ON khu vực.region_name = tempUsers.region LEFT JOIN khu AS khu vực ON zone.zone_name = tempUsers.zone;

Nếu id là AUTO_INCREMENT, thì bạn có thể muốn làm điều này hơi khác. (Để lại id ra khỏi INSERT và SELECT. Bởi vì AUTO_INCREMENT sẽ làm cho rowcount để tăng 1 mỗi khi kỷ lục mới vào)

Hạnh phúc trình

1

Thông thường đây là những gì tôi Do.

Tạo công thức excel để tạo tập lệnh chèn. Id sẽ là tự động tạo nên chỉ cần bỏ qua nó. Giả sử id của bạn nằm trong ô A, tên trong ô B, vùng và vùng tương ứng trong C và D.

="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&"')"; 

Sau khi tạo 1 kéo công thức xuống hàng cuối, sao chép tập lệnh và thực thi.

Những điều tôi xem xét:

  1. cần vá trong rất nhiều môi trường, địa phương, SIT, UAT, Sản xuất lẽ. Tôi không có quyền truy cập DB vào môi trường sản xuất để chèn tập lệnh là cách tốt nhất.
  2. Không liên quan đến quá nhiều thứ và dễ thay đổi hơn trong trường hợp lần sau cần thiết với cột mới được thêm vào.
1

Để yêu cầu lặp lại, Khóa ngoại có thể được ánh xạ trong Excel. Bảng khu vực xuất khẩu và bảng vùng vào tệp Excel. tương tự (ví dụ: filename: lookupmaster.xlsx)

region name region Id 
Polon   1 
yerni   2 

Trong bảng tính với dữ liệu thực tế, thêm hai cột như

region_id, zone_id 

Nhận Id khu vực cho tất cả các hàng sử dụng VLOOKUP

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

Để xóa phụ thuộc vào cột chính, cột chính, cột Id sao chép và dán đặc biệt thành các giá trị chỉ ở vị trí của nó.

Lặp lại tương tự cho khu Id

Bạn có thể loại bỏ các khu vực và khu vực cột từ bảng tính và nhập nó vào cơ sở dữ liệu.

Các vấn đề liên quan