1

有没有办法将数据从触发器写入文件到磁盘?文件名需要动态创建。

使用 PREPARE 对触发器不起作用。例如

SET @Query1 = 
CONCAT("SELECT ",'data'," INTO DUMPFILE 'c:/temp/", UNIX_TIMESTAMP(),"-",RAND(), ".txt'");
PREPARE statementCreate FROM @Query1;
EXECUTE statementCreate;
DEALLOCATE PREPARE statementCreate;

注意:数据是一个变量

或者还有其他解决方案可以从触发器附加到同一个文件?也会起作用。

4

2 回答 2

5

MySQL 文档说:

SQL 准备语句(PREPARE、EXECUTE、DEALLOCATE PREPARE)可用于存储过程,但不能用于存储函数或触发器。因此,存储函数和触发器不能使用动态 SQL(您将语句构造为字符串然后执行它们)。

所以不 - 您不能将数据写入文件,该文件的名称是从触发器动态创建的。

由于您不能使用动态 sql,但您也批准单个文件名并将数据附加到它,您可以将数据加载到临时文件,附加查询结果,然后将完整结果输出到文件。当然,只有在除了文件名之外没有其他需要使用动态创建的查询的情况下,它才会起作用。

例如:

DELIMITER $$

CREATE TRIGGER rewrite_file AFTER INSERT tableName
BEGIN

  CREATE TEMPORARY TABLE IF NOT EXISTS temp(
    pk BIGINT
  );

  LOAD DATA INFILE 'c:/somefile.txt' INTO TABLE temp
  LINES TERMINATED BY '\n';

  INSERT INTO temp (pk) SELECT primaryKeyField FROM tableName;

  SELECT pk INTO OUTFILE 'c:/somefile.txt'
  LINES TERMINATED BY '\n'
  FROM temp;

END$$

DELIMITER ;

它将在每次插入时附加文件 c:/somefile.txt。当然,如果您的文件增长到数百万个条目,则此解决方案很糟糕。

于 2013-09-12T13:01:42.977 回答
4

解决方案是:MySQL UDF:http ://www.mysqludf.org 。我安装了 sys_exec 函数,然后从触发器中我有类似 SET @ret_val = sys_exec(CONCAT('echo.>d:/temp/',NEW.id, '-', UNIX_TIMESTAMP() , '.txt')); 这将为每个插入创建一个空文件。在 windows 和 linux(CentOS) 上测试。

于 2013-09-16T08:28:58.637 回答