有一种方法可以将数据从触发器写入磁盘到文件中吗?需要动态创建文件名。
使用PREPARE不会对触发器起作用。 例如
SET @Query1 =
CONCAT("SELECT ",'data'," INTO DUMPFILE 'c:/temp/", UNIX_TIMESTAMP(),"-",RAND(), ".txt'");
PREPARE statementCreate FROM @Query1;
EXECUTE statementCreate;
DEALLOCATE PREPARE statementCreate;
注意:数据是变量
或者还有其他解决方案可以从触发器附加到同一个文件?也会这样做。
答案 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)上测试。