我不是最熟练的开发人员,但是我的朋友和我组建了一个项目,并创建了一个工厂自动浇水系统。我的职责是让网站工作并显示系统创建的统计数据。
如何在从CSV文件添加新数据之前让我的代码清除表格?
这里是索引页面上显示的代码:
<!-- Importing the CSV -->
<div id="wrap">
<h2 class='sub-header'>Upload .csv to refresh data</h2>
<?php
include("csv.php");
$csv = new csv();
if ( isset($_POST['sub'])) {
$csv->import($_FILES['file']['tmp_name']);
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" class="btn btn-info"><br>
<input type="submit" name="sub" value="Import" class="btn btn-success">
</form>
</div>
</div>
</div>
这是PHP文件:
<?php
class csv extends mysqli
{
private $state_csv = false;
public function __construct()
{
parent::__construct("localhost","root","raspberry","statistics");
if ($this->connect_error) {
echo "Failed to connect to the database: ". $this->connect_error;
}
}
public function import($file)
{
$file = fopen($file, 'r');
while ($row = fgetcsv($file)) {
$value = "'". implode("','", $row) ."'";
$q = "INSERT INTO data(moisture_of_soil,temperature,humidity,light_levels,last_updated) VALUES(". $value .")";
if ( $this->query($q) ) {
$this->state_csv = true;
}else {
$this->state_csv = false;
}
}
if ($this->state_csv) {
echo "<meta http-equiv='refresh' content='0'>";
} else {
echo "Something went wrong.";
}
}
}
?>
答案 0 :(得分:2)
...
"preinstall": "node yarn_remove_hash.js"
...
非常快速有效,但会重置所有TRUNCATE name
值。如果您有其他表通过这些标识符引用此表,这可能会有问题,它可能会将数据链接到随机位置。
AUTO_INCREMENT
会删除所有内容,但不会重置DELETE FROM name
个计数器。它往往较慢,特别是在有大量争用的大型表上,但具有不回收标识符的优势。
您需要确定哪两个适合您的特定用例。对于没有引用交叉链接的表格,AUTO_INCREMENT
通常效果最佳。
答案 1 :(得分:1)
我更喜欢这种方式:
CREATE TABLE new LIKE real; (or spell out the schema)
LOAD DATA .. INTO new ...;
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
唯一缓慢的部分是LOAD
RENAME是原子的
表real
始终可用(无停机时间)。
答案 2 :(得分:0)
这更像是@ tadman已经正确答案的附录,但是评论太长了。
性能差异是TRUNCATE
或多或少只会丢弃表的数据文件并创建一个新的空数据,这是一个很大的,相当连续的IO操作,操作系统可以非常有效地处理。
另一方面,一系列DELETE
语句是很多微小的IO操作,会使磁盘陷入困境,也无法恢复后备数据文件中的任何空间。
如果 要转到DELETE
路由,我强烈建议将事务中的所有删除操作都包含在内,这将有助于在某种程度上优化IO。然后,一旦你导入了所有数据[也应该在事务中,最好是同一个],你可以运行OPTIMIZE TABLE
操作来从后备数据文件中恢复任何未使用的磁盘空间,假设数据大小有足够的差异以保证它。
第三种选择:
last_updated
的字段。START TRANSACTION;
SET @start = NOW();
INSERT INTO table ... ON DUPLICATE KEY UPDATE ...;
DELETE FROM table WHERE last_updated < @start;
COMMIT;
作为奖励,如果你正在使用这样的交易,那么你的应用程序会有一个“坏”或缺少一组数据的时间点。
参考文献: