2 Stimmen

MySQL SELECT INTO OUTFILE und benutzerdefinierte Variablen

Irgendeine Idee, warum dies in MySQL 5.1 fehlschlägt?

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

SELECT *
FROM `tableA`
INTO OUTFILE @OUTFILE;

Ist das eine Einschränkung von MySQL's SELECT oder übersehe ich hier etwas?

5voto

longneck Punkte 11522

Sie können für den Dateinamen keine Variable verwenden. Wie bei LIMIT muss es sich um einen literalen Wert handeln, nicht um eine Formel oder eine Variable.

z. B. unter welchem Dateinamen soll die Datei hier gespeichert werden?

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

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

Dies ist eine ähnliche Einschränkung wie bei LIMIT. Wenn Ausdrücke in LIMIT-Klauseln erlaubt wären, könnten Sie Abfragen mit unvorhersehbarem Verhalten erstellen. Nehmen wir zum Beispiel an, Sie haben eine Tabelle mit 10 Zeilen und Spalte a hat die Werte 1 bis 10. Was ist die Ausgabe dieser Abfrage?

SELECT *
  FROM myTable
ORDER
    BY a
 LIMIT 10 - a

Die Grundlage für diese Einschränkung ist: Wenn Sie den Grenzwert berechnen können, sollten Sie den Grenzwert explizit berechnen und dann die Abfrage mit dem Literalwert erstellen. 10 - a die ausgewertet werden müssen, macht den Abfrageausführungsplan potenziell VIEL komplizierter.

0 Stimmen

Ich werde dies als beantwortet markieren, wenn sonst niemand antwortet, aber ich frage mich, warum. Ist es per Definition so oder ist es nur eine Eigenart der Implementierung oder so?

0 Stimmen

Ich habe meine Antwort oben erweitert, um zu erklären, warum.

0 Stimmen

@longneck Ich versuche, den ersten Teil Ihres Codes in der Antwort zu verwenden, aber ich erhalte 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 Haben Sie eine Ahnung, warum?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X