【问题标题】:mysql: Overwrite Table Datamysql:覆盖表数据
【发布时间】:2017-09-02 19:41:59
【问题描述】:

每 24 小时,我必须将更新后的 csv 文件中的 1 行或多行添加到我的表数据中。 我已经在我的 php 文件中尝试过这个查询:

TRUNCATE TABLE mytable;

然后使用此查询 (PDO) 插入新的:

INSERT INTO mytable VALUES(:date,:data1,:data2,:data3,:data4,:data5)

它的工作,但页面需要永远加载。 是否有任何解决方案来更新我的表,忽略旧的并从更新的 csv 文件中添加新行,而不是 TRUNCATEINSERT 整个数据?

提前致谢。

【问题讨论】:

  • 只运行插入。如果您想知道在某一天插入了什么,您可以存储插入的日期并根据该日期进行查询。
  • 在运行截断之前mytable 中有多少行?
  • @RiggsFolly 大约 200 行。

标签: php mysql csv pdo


【解决方案1】:

您是否尝试过使用 INSERT IGNORE? 它会跳过数据库中已经存在的行。

INSERT IGNORE INTO mytable VALUES(:date,:data1,:data2,:data3,:data4,:data5)

https://dev.mysql.com/doc/refman/5.7/en/insert.html

【讨论】:

  • 我没有,我稍后再试试,项目在我的电脑里。感谢你的回答。当我使用 INSERT IGNORE 时,我会通知你。
  • 我已经尝试使用 INSERT IGNORE 和 REPLACE 进行查询,它可以工作,但是使用 LOAD DATA INFILE 比使用 INSERT 或 REPLACE 更快。不过谢谢你给我答案。
【解决方案2】:

将内容从 csv 文件传输到 db 表的非常快速的 MySQL 方法是使用 LOAD DATA INFILE

LOAD DATA INFILE "<path-to>/yourfile.csv"
REPLACE
INTO TABLE <db-name>.<table-name>
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(col1, col2, col3);

让它从 PHP 中执行。

注意事项

  • 如果您在 csv 中有表头,请使用 IGNORE 1 LINES
  • FIELDS TERMINATED BY ','LINES TERMINATED BY '\n' 描述了输入字段和行是如何在 csv 文件中形成的。自定义它们以适合您的文件内容的形式。
  • 最后一行,例如(col1, col2, col3),定义了输入值应该被传输到的列。因为没有定义主键或唯一索引列,所以不会更新任何记录。只有插入操作。

现在向列表中添加一个 PRIMARY KEY 列(假设它的名称为 ID_COL)。或者一个定义了唯一索引的:

LOAD DATA INFILE "<path-to>/yourfile.csv"
REPLACE
INTO TABLE <db-name>.<table-name>
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(ID_COL, col1, col2, col3);

然后,如果 db 记录的ID_COL 值与相应的 csv 输入值相等,则记录将被更新。例如。旧值将被替换 - 这就是关键字 REPLACE 的用途。否则将插入一个新的。

请耐心阅读 LOAD DATA INFILE 文档,让您了解此方法所涉及的所有方面。特别是在第二部分中,描述了使用变量自定义更新/插入值的细节。

祝你好运!

编辑:

我昨天刚刚写了an answer,您可能会感兴趣(关于有条件的 csv 上传)。

【讨论】:

  • 抱歉迟到了。我试过了。它就像一个魅力。使用加载数据 infile 似乎比使用插入/替换快得多。非常感谢你。你有我的赞成票!
  • @nugrohodwiariansyah 迟到的答案没问题。不客气!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2013-10-06
  • 2016-07-09
相关资源
最近更新 更多