很抱歉,如果以前曾经问过这个问题,但我在SE上找不到与我的案例相关的任何内容。
我正在尝试将CSV文件导入到我的Mysql数据库表中,其中CSV表具有完全相同的数量和列的顺序,但CSV文件中没有丢失表的列ID
。
我想要实现的是将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";
?>
谢谢
答案 0 :(得分:2)
您可以在导入期间为某些列设置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;
答案 1 :(得分:0)
AUTO_INCREMENT属性可用于为新行生成唯一标识。大多数版本的mysql和engin都支持这个。您无需担心ID,可以使用cron作业插入所需的字段,AUTO_INCREMENT将负责id本身。 没有为AUTO_INCREMENT列指定值,因此MySQL会自动分配序列号。除非启用了NO_AUTO_VALUE_ON_ZERO SQL模式,否则还可以为列显式指定0以生成序列号。如果列声明为NOT NULL,则还可以为列分配NULL以生成序列号。当您将任何其他值插入AUTO_INCREMENT列时,该列将设置为该值并重置序列,以便下一个自动生成的值按顺序从最大列值开始。
您可以使用LAST_INSERT_ID()SQL函数或mysql_insert_id()C API函数检索最新自动生成的AUTO_INCREMENT值。这些函数是特定于连接的,因此它们的返回值不受另一个也执行插入的连接的影响。
参见官方链接示例: [https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html]
答案 2 :(得分:0)
由于您想要反复重新创建表格并希望操纵CSV中的数据,请尝试以下操作:
// You have to create the TABLE if not exists
$pdo->exec("TRUNCATE TABLE sample"); // No need to drop the table if columns don't change.
$csvContent = file_get_contents($csvfile); // Raw Data from file
$lines = explode("
", $csvContent); // The standard line separator is an ENTER
// Now you have each line separated
for($i = 0; $i < coount($lines); $i++) {
$col = explode(";", $lines[$i]); // Would be a comma
// Now you have each column separated
$pdo->exec("INSERT INTO sample (id, col1, col2, col3 ... coln) VALUES (NULL, '".$col[0]."', '".$col[1]."', '".$col[2]."' ... '".$col[n]."')");
}
通过这种方式,您可以深入了解数据,除了设置AUTO_INCREMENT ID之外,您还可以验证来自CSV的内容并纠正/防止导入错误。