13.2.10.1 SELECT .. . INTO Declarație
Forma SELECT ... INTO
a SELECT
activează un rezultat al interogării care trebuie stocat în variabile sau scris într-un fișier:
-
SELECT ... INTO
selectează valorile coloanei și le stochează în variabile.var_list
-
SELECT ... INTO OUTFILE
scrie rândurile selectate într-un fișier. Terminatoarele de coloane și linii pot fi specificate pentru a produce un format de ieșire specific. -
SELECT ... INTO DUMPFILE
scrie un singur rând într-un fișier fără nicio formatare.
O instrucțiune SELECT
dată poate conține cel mult o clauză INTO
, deși așa cum se arată în SELECT
descrierea sintaxei (vezi Secțiunea 13.2.10,„ Instrucțiunea SELECT ”), INTO
poate apărea în poziții diferite:
-
Înainte de
FROM
. Exemplu: -
Înainte de o clauză de blocare finală. Exemplu:
-
La sfârșitul
SELECT
. Exemplu:
la sfârșitul instrucțiunii este acceptată începând cu MySQL 8.0.20 și este poziția preferată. Poziția dinaintea unei clauze de blocare este depreciată începând cu MySQL 8.0.20; în af versiunea uture a MySQL. Cu alte cuvinte, INTO
după FROM
, dar nu la sfârșitul SELECT
produce un avertizare.
O clauză INTO
nu trebuie utilizată într-o SELECT
imbricată, deoarece un astfel de SELECT
trebuie să returneze rezultatul în contextul exterior. Există, de asemenea, constrângeri în ceea ce privește utilizarea INTO
în cadrul instrucțiunilor UNION
; a se vedea secțiunea 13.2.10.3, „Clauza UNION”.
Pentru varianta INTO
: var_list
-
var_list
numește o listă cu una sau mai multe variabile, fiecare dintre acestea putând fi o variabilă definită de utilizator, o procedură stocată sau un parametru funcțional , sau variabilă locală a programului stocat. (În cadrul unei instrucțiuni pregătiteSELECT ... INTO
, sunt permise numai variabilele definite de utilizator; consultați Secțiunea 13.6.4.2, „Domeniul de aplicare și rezoluția variabilei locale” .)var_list
-
Valorile selectate sunt atribuite variabilelor. Numărul de variabile trebuie să se potrivească cu numărul de coloane. Interogarea ar trebui să returneze un singur rând. Dacă interogarea nu returnează niciun rând, apare un avertisment cu codul de eroare 1329 (
No data
), iar valorile variabilei rămân neschimbate. Dacă interogarea returnează mai multe rânduri, apare eroarea 1172 (Result consisted of more than one row
). Dacă este posibil ca instrucțiunea să preia mai multe rânduri, puteți utilizaLIMIT 1
pentru a limita setul de rezultate la un singur rând.
INTO
poate fi, de asemenea, utilizat cu o instrucțiune var_list
TABLE
, sub rezerva acestor restricții:
-
Numărul de variabilele trebuie să se potrivească cu numărul de coloane din tabel.
-
Dacă tabelul conține mai multe rânduri, trebuie să utilizați
LIMIT 1
pentru a limita setul de rezultate la un singur rând.LIMIT 1
trebuie să preceadă cuvântul cheieINTO
.
Un exemplu a unei astfel de afirmații este prezentată aici:
Puteți selecta, de asemenea, valori dintr-o instrucțiune VALUES
care generează o rând unic într-un set de variabile de utilizator. În acest caz, trebuie să utilizați un alias de tabel și trebuie să atribuiți fiecare valoare din lista de valori unei variabile. Fiecare dintre cele două afirmații prezentate aici este echivalentă cu SET @x=2, @y=4, @z=8
:
Numele variabilelor utilizator nu sunt sensibile la majuscule și minuscule . Consultați secțiunea 9.4, „Variabile definite de utilizator”.
Forma SELECT ... INTO OUTFILE "
a file_name
"SELECT
scrie rândurile selectate într-un fișier. Fișierul este creat pe gazda serverului, deci trebuie să aveți privilegiul FILE
pentru a utiliza această sintaxă. file_name
nu poate fi un fișier existent, ceea ce, printre altele, împiedică modificarea fișierelor precum /etc/passwd
și tabelele bazei de date. Variabila de sistem character_set_filesystem
controlează interpretarea numelui fișierului.
Instrucțiunea SELECT ... INTO OUTFILE
este destinată să permită descărcarea unui tabel într-un fișier text de pe gazda serverului.Pentru a crea fișierul rezultat pe o altă gazdă, SELECT ... INTO OUTFILE
în mod normal nu este adecvat deoarece nu există nicio modalitate de a scrie o cale către fișier în raport cu sistemul de fișiere gazdă al serverului, cu excepția cazului în care locația fișierul de pe gazda de la distanță poate fi accesat folosind o cale mapată de rețea pe sistemul de fișiere gazdă al serverului.
Alternativ, dacă software-ul client MySQL este instalat pe gazda de la distanță, puteți utiliza o comandă client precum mysql -e "SELECT ..." >
pentru a genera fișierul pe gazda respectivă. file_name
SELECT ... INTO OUTFILE
este complementul LOAD DATA
. Valorile coloanelor sunt scrise convertite în setul de caractere specificat în clauza CHARACTER SET
. Dacă nu există o astfel de clauză, valorile sunt eliminate folosind setul de caractere binary
. De fapt, nu există o conversie a setului de caractere. Dacă un set de rezultate conține coloane în mai multe seturi de caractere, la fel este și fișierul de date de ieșire și este posibil să nu fie posibil să reîncărcați fișierul corect.
Sintaxa pentru export_options
parte a instrucțiunii constă din același FIELDS
și LINES
clauze care sunt utilizate cu instrucțiunea LOAD DATA
. Pentru informații despre clauzele FIELDS
și LINES
, inclusiv valorile lor implicite și valorile admisibile, consultați Secțiunea 13.2.7, „Declarație de date de încărcare” .
FIELDS ESCAPED BY
controlează modul de scriere a caracterelor speciale. Dacă caracterul FIELDS ESCAPED BY
nu este gol, este utilizat când necesar pentru a evita ambiguitatea ca prefix care precede următoarele caractere la ieșire:
-
FIELDS ESCAPED BY
caracter -
Caracterul
FIELDS ENCLOSED BY
-
Primul caracter al
FIELDS TERMINATED BY
șiLINES TERMINATED BY
valori -
ASCII
NUL
(octetul cu valoare zero; ceea ce se scrie de fapt după caracterul de evadare este ASCII0
, nu un octet cu valoare zero)
FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, sau LINES TERMINATED BY
trebuie scăpate caractere, astfel încât să puteți citi fișierul înapoi în mod fiabil. ASCII NUL
este scăpat pentru a facilita vizualizarea cu unele pagere.
Fișierul rezultat nu trebuie să se conformeze sintaxei SQL, așa că nimic altceva nu trebuie scăpat.
Dacă caracterul FIELDS ESCAPED BY
este gol, nu se scapă caractere și NULL
este afișat ca NULL
, nu \N
. Probabil că nu este o idee bună să specificați un caracter de evacuare gol, mai ales dacă valorile câmpului din datele dvs. conțin oricare dintre caracterele din lista tocmai dată.
INTO OUTFILE
poate fi utilizat și cu o instrucțiune TABLE
atunci când doriți să aruncați toate coloanele unui tabel într-un fisier text. În acest caz, ordinea și numărul de rânduri pot fi controlate folosind ORDER BY
și LIMIT
; aceste clauze trebuie să preceadă INTO OUTFILE
. TABLE ... INTO OUTFILE
acceptă același export_options
ca și SELECT ... INTO OUTFILE
și este supus acelorași restricții la scrierea în sistemul de fișiere. Un exemplu de astfel de afirmație este prezentat aici:
Puteți utiliza, de asemenea, SELECT ... INTO OUTFILE
cu o declarație VALUES
pentru a scrie valorile direct într-un fișier. Un exemplu este prezentat aici:
Trebuie să utilizați un alias de tabel; aliasurile de coloană sunt, de asemenea, acceptate și pot fi utilizate opțional pentru a scrie valori numai din coloanele dorite. De asemenea, puteți utiliza oricare sau toate opțiunile de export acceptate de SELECT ... INTO OUTFILE
pentru a formata ieșirea în fișier.
Iată un exemplu care produce un fișier în format de valori separate prin virgulă (CSV) utilizat de mai multe programe:
Dacă utilizați INTO DUMPFILE
în loc de INTO OUTFILE
, MySQL scrie doar un rând în fișier, fără terminarea coloanei sau a liniilor și fără a efectua nicio procesare de evacuare. Acest lucru este util pentru selectarea unei valori BLOB
și stocarea acesteia într-un fișier.
Orice fișier creat de INTO OUTFILE
sau INTO DUMPFILE
este deținut de utilizatorul sistemului de operare sub al cărui cont rulează mysqld. (Nu ar trebui să rulați niciodată mysqld ca root
din acest motiv și din alte motive.) Începând cu MySQL 8.0.17, masca pentru crearea fișierului este 0640; trebuie să aveți suficiente privilegii de acces pentru a manipula conținutul fișierului. Înainte de MySQL 8.0.17, umask-ul este 0666 și fișierul poate fi scris de toți utilizatorii de pe gazda serverului.
Dacă variabila de sistem secure_file_priv
este setată la un nume de director care nu este gol, fișierul care trebuie scris trebuie localizat în acel director.
În contextul instrucțiunilor SELECT ... INTO
care apar ca parte a evenimentelor executate de Programatorul de evenimente, mesajele de diagnosticare (nu numai erori, ci și avertismente) sunt scrise în jurnalul de erori și, pe Windows, la jurnalul de evenimente al aplicației. Pentru informații suplimentare, consultați secțiunea 25.4.5, „Starea programatorului de evenimente”.
Începând cu MySQL 8.0.22, este oferită asistență pentru sincronizarea periodică a fișierelor de ieșire scrise de SELECT INTO OUTFILE
și SELECT INTO DUMPFILE
, activate prin setarea variabilei de sistem a serverului select_into_disk_sync
introdusă în acea versiune. Dimensiunea bufferului de ieșire și întârzierea opțională pot fi setați utilizând, respectiv, select_into_buffer_size
și select_into_disk_sync_delay
. Pentru mai multe informații, consultați descrierile acestor variabile de sistem.