如何在使用PHP导入CSV之前清除表格?

时间:2018-04-18 19:56:48

标签: php mysql arrays import-from-csv

我不是最熟练的开发人员,但是我的朋友和我组建了一个项目,并创建了一个工厂自动浇水系统。我的职责是让网站工作并显示系统创建的统计数据。

如何在从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.";
        }
    }
}
?>

3 个答案:

答案 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操作来从后备数据文件中恢复任何未使用的磁盘空间,假设数据大小有足够的差异以保证它。

第三种选择:

  1. 添加基本上为last_updated的字段。
  2. START TRANSACTION;
  3. SET @start = NOW();
  4. 循环:INSERT INTO table ... ON DUPLICATE KEY UPDATE ...;
  5. DELETE FROM table WHERE last_updated < @start;
  6. COMMIT;
  7. 作为奖励,如果你正在使用这样的交易,那么你的应用程序会有一个“坏”或缺少一组数据的时间点。

    参考文献: