在MYSQL LOAD DATA INFILE中参数化文件名

时间:2010-05-14 09:53:43

标签: mysql load-data-infile

有没有办法在LOAD DATA INFILE中动态指定文件名?它可以像参数化一样(语法可能不正确)LOAD DATA INFILE'$ filename'?

4 个答案:

答案 0 :(得分:2)

不幸的是,MySQL尚不支持此功能,目前列为错误/功能请求#39115 http://bugs.mysql.com/bug.php?id=39115

答案 1 :(得分:2)

或者您可以制作文件的临时副本(BATCH示例):

LOAD_DATA.bat

COPY %1 TempFileToLoad.csv
mysql --user=myuser --password=mypass MyDatabase < ScriptLoadMyDatabase.sql
DEL TempFileToLoad.csv

SQL(信息):

ScriptLoadMyDatabase.sql

load data infile 'TempFileToLoad.csv' IGNORE
into table tLoad
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
lines terminated by '\r\n'
IGNORE 1 LINES
(@DateCrea, NomClient, PrenomClient, TypeMvt, @Montant, NumeroClient)
set DateCrea = str_to_date(@DateCrea, '%Y-%m-%d'), Montant = (round(@Montant / 1000)*2) ;

完成在SendTo windows文件夹中放置BAT文件的链接。

答案 2 :(得分:1)

来自MySQL documentation的引文:

  

LOAD DATA INFILE语句以非常高的速度将文本文件中的行读取到表中。文件名必须以文字字符串形式给出。

这意味着它不能是预准备语句的参数。但是没有人禁止进行字符串插值,而语句只是PHP代码中的一个字符串。

答案 3 :(得分:0)

如果你问它是否可以在脚本中使用;你可以用php做这样的事情:

<?php
$mysqli = new mysqli("host", "user", "pwd", "db");
/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}


$sql = "CREATE TABLE number1 (id INT PRIMARY KEY auto_increment,data TEXT)";
if ($result = $mysqli->query($sql)) {
} else {
printf("<br>%s",$mysqli->error);

}

$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$filename = "data.csv";

$sql = "LOAD DATA LOCAL INFILE '$host$uri$filename' INTO TABLE number1";
if ($result = $mysqli->query($sql)) {

} else {
printf("<br>%s",$mysqli->error);    
}
// Close the DB connection
$mysqli->close();

exit;
%>

如果文件与脚本位于同一文件夹中,则只使用$ filename a而不是$ host $ uri $ filename。我从一些我正在使用的脚本中快速地将它放在一起,抱歉如果没有调试它不起作用,但它应该非常接近。它需要mysqli。