Mysql触发器将数据写入文件

时间:2013-09-12 12:43:35

标签: mysql

有一种方法可以将数据从触发器写入磁盘到文件中吗?需要动态创建文件名。

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

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

注意:数据是变量

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

2 个答案:

答案 0 :(得分:3)

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。当然,如果您的文件增长到数百万条目,这个解决方案很糟糕。

答案 1 :(得分:2)

解决方案是: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)上测试。