2013-08-01 39 views
12

Tôi muốn tạo một tập lệnh bash kết nối với máy chủ MySQL của tôi và chèn một số valuse từ một tệp txt. Tôi đã viết ra:Tập lệnh Bash để chèn các giá trị trong MySQL

#!/bin/bash 
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('cat test.txt');" | mysql -uroot -ptest test; 

nhưng tôi recieving các lỗi sau:

ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1

Tôi cho rằng lỗi là trong file txt của tôi, nhưng tôi đã cố gắng rất nhiều biến thể và vẫn không có hy vọng thành công.

file txt của tôi trông như thế này:

10.16.54.29 00:f8:e5:33:22:3f marsara

Trả lời

8

Giả sử bạn có nhiều hàng để thêm, bạn có thể cần LOAD DATA INFILE tuyên bố, không INSERT. Tệp nguồn phải nằm trên máy chủ, nhưng có vẻ như đây là trường hợp ở đây.

Something như thế:

#!/bin/bash 

mysql -uroot -ptest test << EOF 

LOAD DATA INFILE 'test.txt' 
    INTO TABLE tbl_name 
    FIELDS TERMINATED BY ' '; 

EOF 

LOAD DATA INFILE có nhiều lựa chọn như bạn sẽ khám phá ra bằng cách đọc doc.

5

Bạn đang cố gắng chèn giá trị "cat test.txt" làm Chuỗi trong cơ sở dữ liệu trong câu lệnh INSERT yêu cầu 3 tham số (IP, MAC và SERVER) vì vậy đây là lý do bạn nhận được thông báo lỗi này.

Bạn cần phải đọc các tập tin văn bản đầu tiên và trích xuất các IP, MAC và các giá trị Server và sau đó sử dụng chúng trong các truy vấn mà sẽ trông như thế này một lần điền:

#!/bin/bash 
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('10.16.54.29', '00:f8:e5:33:22:3f', 'marsara');" | mysql -uroot -ptest test; 
19

Hãy thử điều này một:

#!/bin/bash 
inputfile="test.txt" 
cat $inputfile | while read ip mac server; do 
    echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('$ip', '$mac', '$server');" 
done | mysql -uroot -ptest test; 

Bằng cách này, bạn phát trực tuyến tệp đọc cũng như việc thực hiện coms mysql.

+1

Cảm ơn bạn ... đây là một giải pháp tốt! – user2642601

+0

Điều này cũng làm việc cho tôi, cảm ơn –

2

tôi sử dụng này và nó hoạt động:

mysql -uroot -proot < infile 

hoặc chọn cơ sở dữ liệu đầu tiên

./mysql -uroot -proot db_name < infile 

hoặc sao chép toàn bộ SQL vào clipboard và dán nó với

pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile 
Các vấn đề liên quan