【问题标题】:PHP & MySQL: Using a 'NOT NULL AUTO_INCREMENT' on a table that truncatesPHP & MySQL:在截断表上使用“NOT NULL AUTO_INCREMENT”
【发布时间】:2014-12-01 02:49:42
【问题描述】:

我真的被困在这里我有这个 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' 键上使用 'NOT NULL AUTO_INCREMENT' 属性。

但是,当我的表被截断时,每次运行我的脚本时不会删除 ID?

我可以在我的脚本中添加任何东西来解决这个问题吗?

谢谢

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    是的。截断表相当于delete from table 并删除所有记录。但是 auto_increment 不会再次重置为 0。最后使用的 auto_inc 值是表元数据的一部分,不受截断操作的影响。

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

    如果您希望在截断后重置 auto_increment 值,您必须这样做:

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

    所以是的...结果 truncate 确实重置了 auto_increment 值。绝对看起来是错误的,因为它在截断时显然也不会处理任何级联删除。重新填充在别处用作外键的截断表无疑会导致不正确的记录连接。

    【讨论】:

    • 我认为你有这个倒退。截断重置删除操作不会的自动增量。 Delete Example 显示尚未重置的键。您可以将删除语句更改为截断,然后查看它们是否已重置。
    • 有趣...刚刚在这里测试过...这绝对是错误的。永远不应该回收 auto_inc 值。
    • 你让我思考了一秒钟,我必须先对其进行测试以确认我的想法(截断重置)。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 2015-04-08
    • 2011-06-09
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2012-06-02
    • 2019-01-01
    相关资源
    最近更新 更多