MySQL SELECT INTO OUTFILE和用户定义的变量

时间:2009-10-07 20:43:31

标签: mysql sql into-outfile

知道为什么这在MySQL 5.1中失败了:

SET @LOAD_TIME = UNIX_TIMESTAMP();
SET @OUTFILE = CONCAT(CONCAT('/tmp/outfile_', @LOAD_TIME), '.sql');

SELECT *
FROM `tableA`
INTO OUTFILE @OUTFILE;

这是对MySQL的SELECT的限制还是我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:5)

您不能将变量用于文件名。像LIMIT一样,它必须是字面值,而不是公式或变量。

例如,将要写入此文件的文件名是什么?

SET @LOAD_TIME = UNIX_TIMESTAMP();
SET @OUTFILE = CONCAT(CONCAT('/tmp/outfile_', @LOAD_TIME), '.sql');

SELECT @OUTFILE = columnA
, columnB
FROM `tableA`
INTO OUTFILE @OUTFILE;

这与LIMIT上的限制类似。如果在LIMIT子句中允许使用表达式,则可能会出现具有不可预测行为的查询。例如,假设您有一个包含10行的表,而a列的值为1到10.这个查询的输出是什么?

SELECT *
  FROM myTable
ORDER
    BY a
 LIMIT 10 - a

此限制的基础是:如果您可以计算限制,则应明确计算限制,然后使用文字值构建查询。允许评估像10 - a这样的表达式会使查询执行计划变得更加复杂。