Bạn không thể sử dụng PREPARE
để chạy LOAD DATA INFILE
.
Danh sách các câu lệnh mà bạn có thể chạy với PREPARE
được ghi lại trong trang này: https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
dưới tiêu đề phụ "Cú pháp SQL được phép trong các câu lệnh soạn sẵn". Lưu ý rằng danh sách này có thể khác trong các phiên bản MySQL trước đó.
Vì bạn không thể sử dụng PREPARE
, bạn không thể thực hiện phương pháp bạn đang sử dụng bằng cách đặt một biến và tạo một câu lệnh SQL động.
Nhưng bạn có thể chạy LOAD DATA INFILE
mà không cần sử dụng PREPARE
. Bạn phải nội suy tên tệp vào câu lệnh bằng cách sử dụng thay thế biến shell và sau đó chạy nó như một câu lệnh SQL trực tiếp.
Tệp update.sql của bạn có thể trông giống như sau:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Sau đó, bạn có thể thay thế biến shell của mình vào tệp và chạy kết quả theo cách này:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Một cách khác đơn giản hơn là sử dụng mysqlimport
, ngoại trừ điều này yêu cầu tên tệp đầu vào phải giống với tên bảng của bạn. Bạn có thể đổi tên tệp đầu vào của mình để phù hợp với bảng bạn muốn tải vào (cái mà bạn gọi là tmp
), hoặc nếu không hãy tạo một liên kết tượng trưng:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
Phần mở rộng ".list" bị mysqlimport bỏ qua, vì vậy bạn có thể sử dụng bất kỳ phần mở rộng tệp nào hoặc không có.