MySQL SELECT INTO OUTFILE и пользовательские переменные - PullRequest
2 голосов
/ 08 октября 2009

Любая идея, почему это не удается в MySQL 5.1:

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

SELECT *
FROM `tableA`
INTO OUTFILE @OUTFILE;

Это ограничение SELECT в MySQL или я что-то здесь упускаю?

1 Ответ

5 голосов
/ 08 октября 2009

вы не можете использовать переменную для имени файла. подобно 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 делает план выполнения запроса НАМНОГО более сложным.

...