PHP&;MySQL:使用';非空自动增量';在截断的表上

PHP&;MySQL:使用';非空自动增量';在截断的表上,php,mysql,sql,Php,Mysql,Sql,我真的被困在这里我有一个PHP脚本: <?php $databasehost = "localhost"; $databasename = ""; $databasetable = ""; $databaseusername=""; $databasepassword = ""; $fieldseparator = ","; $lineseparator = "\n"; $enclosedbyquote = '"'; $csvfile = "db-core/feed/csv

我真的被困在这里我有一个PHP脚本:

<?php


$databasehost = "localhost"; 
$databasename = ""; 
$databasetable = ""; 
$databaseusername=""; 
$databasepassword = ""; 
$fieldseparator = ","; 
$lineseparator = "\n";
$enclosedbyquote = '"';
$csvfile = "db-core/feed/csv/csv.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());
}

$pdo->exec("TRUNCATE TABLE `$databasetable`");

    $affectedRows = $pdo->exec("
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." REPLACE INTO TABLE `$databasetable`
    FIELDS OPTIONALLY ENCLOSED BY ".$pdo->quote($enclosedbyquote)."
     TERMINATED BY ".$pdo->quote($fieldseparator)." 
    LINES TERMINATED BY ".$pdo->quote($lineseparator)." 
    IGNORE 1 LINES");

echo "Loaded a total of $affectedRows records from this csv file.\n";

?>

如您所见,脚本正在用CSV文件截断我的表。它将替换MySQL表中当前的所有数据

此数据用于创建包含库存车辆的列表页面,每行包含一辆车辆的数据。此脚本每天运行一次,以替换不再库存的车辆

现在我想给我的每个SQL行赋予它自己的页面,我被告知我需要在“id”键上使用“notnull AUTO_INCREMENT”属性

然而,当我的表被截断时,每次运行脚本时,ID不会被删除吗

我可以在脚本中添加一些东西来解决这个问题吗

谢谢

是的。截断一个表相当于从表中删除所有记录。但自动增量不会再次重置为0。最后使用的auto_inc值是表元数据的一部分,不受截断操作的影响

如果您有记录0->100,截断表,然后添加新记录,它们将从#101开始并从那里爬升

如果要在截断后重置自动增量值,则必须执行以下操作:

TRUNCATE TABLE foo; // delete all records
ALTER TABLE foo SET auto_increment=1; // reset auto-increment to 1
INSERT ...


所以是的。。。原来truncate会重置自动增量值。显然这似乎是错误的,因为它显然也不会在截断时处理任何级联删除。重新填充在别处用作外键的截断表无疑会导致不正确的记录联接。

我认为这是一种倒退。Truncate将重置自动增量,而delete操作将不会。显示尚未重置的键。您可以将delete语句更改为truncate,并查看它们是否已重置。有趣的。。。刚刚在这里测试过。。这显然是错误的。一个auto_inc值是不应该被回收的。你让我思考了一秒钟,我必须先测试它以确认我的想法(截断重置)。