mysql:覆盖表数据

时间:2017-08-31 21:56:22

标签: php mysql csv pdo

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

TRUNCATE TABLE mytable;

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

您是否尝试使用INSERT IGNORE? 它将跳过DB中已存在的行。

>>

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

答案 1 :(得分:0)

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

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)。或者定义了UNIQUE索引的那个:

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上传)。