很抱歉,如果之前有人问过这个问题,但我在 SE 上找不到与我的案例相关的任何内容。
我正在尝试将 CSV 文件导入到我的 Mysql 数据库表中,其中 CSV 的表具有完全相同的数量和列顺序,但表的列 ID
在CSV 文件。
我想要实现的是将 CSV 导入表中,同时生成一个随每条记录自动增加的 ID
编号。这似乎不可能,因为 CSV 似乎总是想将其数据插入表中的第一列,但在我的情况下,我需要它作为第二列。
我该如何解决这个问题?有什么引用代码可以学习吗?我目前正在研究这种 PDO 方法,但遇到了上述困难。
PHP
<?php
$databasehost = "localhost";
$databasename = "test";
$databasetable = "sample";
$databaseusername="test";
$databasepassword = "";
$fieldseparator = ",";
$lineseparator = "\n";
$csvfile = "filename.csv";
if(!file_exists($csvfile)) {
die("File not found. Make sure you specified the correct path.");
}
try {
$pdo = new PDO("mysql:host=$databasehost;dbname=$databasename",
$databaseusername, $databasepassword,
array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
} catch (PDOException $e) {
die("database connection failed: ".$e->getMessage());
}
$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));
echo "Loaded a total of $affectedRows records from this csv file.\n";
?>
谢谢
最佳答案
您可以在导入期间为某些列设置 MySQL 值。如果您的 id 字段设置为自动递增,则可以在导入期间将其设置为 null,然后 MySQL 会为其分配递增值。
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
LINES TERMINATED BY ".$pdo->quote($lineseparator))."
SET id=null;
编辑 - 如果 CSV 中不存在 ID 列
col1、col2、col3...是数据库表中实际列的名称(不含 id 列)
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
LINES TERMINATED BY ".$pdo->quote($lineseparator))."
(col1, col2, col3,...)
SET id=null;
关于PHP - 带有自动增加 ID 的 CSV 导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42134280/