截断MySQL表但排除第一列

时间:2014-10-06 21:01:09

标签: php mysql

我对如何做到这一点感到有点困惑。

我基本上想要给我的第一列一个' NOT NULL AUTO_INCREMENT'并给每一行他们自己的“id”'。我遇到的问题是我使用的脚本使用每天cron的CSV文件截断整个SQL表来更新数据。

我目前正在使用此脚本:

<?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";

?>

是否可以修改此脚本以忽略我的第一列并截断表格中除第一列之外的所有数据?

然后,我可以将第一列中的所有行都给出自己的ID,知道我该怎么做?

我仍然非常高兴,所以请放轻松我:)

1 个答案:

答案 0 :(得分:1)

从数据库的角度来看,您的问题毫无意义:截断表意味着从该表中完全删除所有,并且批量插入会创建一大堆新的代替它。 SQL中没有“删除列”或“将列插入现有行”这一概念。

要添加或覆盖现有行中的数据,您需要更新这些行。如果您批量插入数据,则意味着您需要以某种方式将每个新行与现有行对齐。如果行数改变会发生什么?如果您只保留行的ID,那么您实际上想要排队的是什么?同样值得指出的是,表中的行实际上并没有订单,所以如果您想要“按顺序”匹配行,您仍然需要按顺序排序......

我认为您需要退后一步,考虑一下实际试图解决的问题(查看“X / Y问题”,了解更多关于考虑特定方法的问题,而不是真正的问题)。

一些可能性:

  • 您需要分配新的数据ID,这些ID会重复使用与旧数据相同的ID范围,但内容不同。
  • 您需要根据某些匹配条件确定哪些导入的行是新的,哪些更新以及要删除的现有行。
  • 您根本不想截断数据,因为它在其他地方被引用,因此需要“软删除”(标记为非活动状态)。