2

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 の制限ですか、それとも何か不足していますか?

4

1 に答える 1

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評価を許可すると、クエリの実行計画が潜在的にはるかに複雑になります。

于 2009-10-07T21:25:32.617 に答える