【问题标题】:MySQL SELECT INTO OUTFILE and User Defined VariablesMySQL SELECT INTO OUTFILE 和用户定义的变量
【发布时间】:2009-10-07 20:43:31
【问题描述】:

知道为什么这在 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 的限制还是我在这里遗漏了什么?

【问题讨论】:

    标签: mysql sql into-outfile


    【解决方案1】:

    文件名不能使用变量。和 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 这样的表达式会使查询执行计划变得更加复杂。

    【讨论】:

    • 如果没有其他人回复,我会将其标记为已回答,但我想知道为什么。是在定义上如此,还是只是实现的怪癖或其他什么?
    • 我已经扩展了上面的答案来解释原因。
    • @longneck 我正在尝试在答案中使用您代码的第一部分,但我收到ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@OUTFILE' at line 5 知道为什么吗?
    • 你错过了我回答的重点。你正在做的事情是不可能的。我的代码就是为什么它不可能的一个例子。
    猜你喜欢
    • 2011-02-21
    • 2012-02-26
    • 2018-06-12
    • 2010-11-05
    • 2013-03-24
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多