我对如何做到这一点感到有点困惑。
我基本上想要给我的第一列一个' 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,知道我该怎么做?
我仍然非常高兴,所以请放轻松我:)
答案 0 :(得分:1)
从数据库的角度来看,您的问题毫无意义:截断表意味着从该表中完全删除所有行,并且批量插入会创建一大堆新的行代替它。 SQL中没有“删除列”或“将列插入现有行”这一概念。
要添加或覆盖现有行中的数据,您需要更新这些行。如果您批量插入数据,则意味着您需要以某种方式将每个新行与现有行对齐。如果行数改变会发生什么?如果您只保留行的ID,那么您实际上想要排队的是什么?同样值得指出的是,表中的行实际上并没有订单,所以如果您想要“按顺序”匹配行,您仍然需要按顺序排序......
我认为您需要退后一步,考虑一下实际试图解决的问题(查看“X / Y问题”,了解更多关于考虑特定方法的问题,而不是真正的问题)。
一些可能性: