我有一个像这样的表结构:
id
assigned_by
assigned_to_user_id
vendor_id
receiver_no
purchase_order_no
destination
po_status
invoice_no
invoice_amount
delivery_date
datetime_done
latest_jda_sync_date
latest_mobile_sync_date
created_at
updated_at
deleted_at
我的csv文件的内容是这样的:
vendor_id receiver_no purchase_order_no destination po_status
30105 20110 10151 9005 3
50015 20114 10155 9005 3
现在我可以加载csv文件并将它们插入我的数据库中。我在下面有这个脚本。
$columns = "(@dummy, @dummy, @dummy, vendor_id, receiver_no, purchase_order_no, destination, po_status, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy)";
$affectedRows = $pdo->exec("
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
LINES TERMINATED BY ".$pdo->quote($lineseparator)." ". $columns);
我遇到的唯一问题是将数据插入正确的列。任何人都可以帮助我。
答案 0 :(得分:2)
处理输入行时,
LOAD DATA
会将其拆分为字段,并根据列/变量列表和SET
子句使用这些值(如果存在)。
换句话说,列列表应该描述应该为每个输入字段分配的数据库列(或用户变量)(而不是描述在哪个输入中)字段每个数据库列都可以找到)。当然,当人们意识到输入文件不需要包含字段名称时,这是显而易见的,因此在所有情况下都不可能采用后一种方法。
因此,您需要:
$columns = '(vendor_id, receiver_no, purchase_order_no, destination, po_status)';
您还需要在命令中添加IGNORE 1 LINES
以跳过第一行(带字段名称):
$affectedRows = $pdo->exec("
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
LINES TERMINATED BY ".$pdo->quote($lineseparator)."
IGNORE 1 LINES ". $columns);
答案 1 :(得分:0)
您需要指定要使用的列(似乎您按照语句的执行顺序对它们进行了调整):
LOAD DATA INFILE 'file.csv'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3, ...)
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\r\n';