PHP - 使用自动增加ID

时间:2017-02-09 10:32:32

标签: php csv mysqli

很抱歉,如果以前曾经问过这个问题,但我在SE上找不到与我的案例相关的任何内容。

我正在尝试将CS​​V文件导入到我的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";

?>

谢谢

3 个答案:

答案 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的内容并纠正/防止导入错误。