【问题标题】:MySQL automatically export to new csv files on triggerMySQL 在触发时自动导出到新的 csv 文件
【发布时间】:2017-12-03 08:27:10
【问题描述】:

我有 10 台机器,我为每台从中收集数据的机器创建了一个表,每台机器的表中都有完全相同的列。列是:order#、timestamp、pv、mv、sp。操作员将在运行机器之前选择 order#,因此我希望 MySQL 数据库在每次输入新的 order# 时将特定于该订单号的行导出到一个名为“order#.csv”的新 CSV 文件。我对数据库很陌生,所以这就是我目前所拥有的:

(SELECT 'Order Number','Timestamp','Mv','Pv','Sp')
union  
(select orderNo,Timestamp,Mv,Pv,Sp
from pid
where orderNo = new.orderNo
INTO OUTFILE 'H:/test.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n');

最后,我想要实现的是拥有一个 CSV 文件,其中包含在机器处理一个订单时收集的所有机器数据,无论它处理该订单的时间有多长。这样我就可以在一台机器上为一个订单创建一个 CSV 文件,然后我可以回去查看不同订单的机器性能。 非常感谢您对此的任何帮助!

【问题讨论】:

  • 那么,成功了吗?
  • 不,它不工作。 “where orderNo = new.orderNo”部分不正确,我仍在研究如何自动生成特定于订单号的文件。
  • 如果这是一个触发器,new.是否类似于SQL中的inserted表?如果是这样,那么您不应该加入基于orderNonew 表吗?
  • 根据此解决方案,您的 outfile 看起来不错。 *.com/questions/356578/…
  • 我刚刚更新了我的问题。我希望数据库将与唯一订单相关联的数据自动导出到新的 CSV 文件中。

标签: mysql sql export-to-csv


【解决方案1】:

要使您的查询正常工作,您只需移动括号。

(SELECT 'Order Number','Timestamp','Mv','Pv','Sp')
union  
(select orderNo,Timestamp,Mv,Pv,Sp
from pid
where orderNo = new.orderNo)         <-- here
INTO OUTFILE 'H:/test.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

但我建议不要在触发器中使用 INTO OUTFILE

  • MySQL 的INTO OUTFILE 不会覆盖现有文件。 见https://dev.mysql.com/doc/refman/5.7/en/select-into.html 上面写着:

    file_name 不能是现有文件,这样可以防止 /etc/passwd 和数据库表等文件被破坏。

    因此,您必须在 csv 文件创建后立即移动或删除,然后触发器再次执行。否则每次要输出时生成一个新的随机 csv 文件名。如果您不执行这些操作之一,INTO OUTFILE 将生成错误,这将导致触发器中止,并导致生成触发器的 INSERT 失败。

  • 使用INTO OUTFILE 还会将文件写入数据库服务器主机,而不是运行应用程序代码的主机。如果您横向扩展以在与数据库不同的主机上运行应用程序,您会发现您的应用程序无法再找到 csv 文件。

  • 仅仅因为执行了触发器,这并不意味着数据将被提交。产生触发器的事务可能会回滚。因此写入 csv 文件的数据将包含未在数据库中提交的“幻像数据”。

相反,我建议您在成功提交数据库更改后使用应用程序代码导出到 csv。

【讨论】:

    最近更新 更多