13.2.10.1 SELECT .. INTO-uttalelse
SELECT ... INTO
form for SELECT
muliggjør et søkeresultat som skal lagres i variabler eller skrives til en fil:
-
SELECT ... INTO
velger kolonneverdier og lagrer dem i variabler.var_list
-
SELECT ... INTO OUTFILE
skriver de valgte radene til en fil. Kolonne- og linjeterminatorer kan spesifiseres for å produsere et bestemt outputformat. -
SELECT ... INTO DUMPFILE
skriver en enkelt rad til en fil uten formatering.
En gitt SELECT
uttalelse kan maksimalt inneholde en INTO
-sats, men som vist av SELECT
syntaksbeskrivelse (se avsnitt 13.2.10,» SELECT Statement «), INTO
kan vises i forskjellige posisjoner:
-
Før
FROM
. Eksempel: -
Før en etterfølgende låseklausul. Eksempel:
-
På slutten av
SELECT
. Eksempel:
INTO
posisjon på slutten av uttalelsen støttes fra og med MySQL 8.0.20, og er den foretrukne posisjonen. Posisjonen før en låseklausul blir utfaset fra og med MySQL 8.0.20; forvent at støtte for den blir fjernet i af uture versjon av MySQL. Med andre ord, INTO
etter FROM
men ikke på slutten av SELECT
advarsel.
En INTO
klausul bør ikke brukes i en nestet SELECT
fordi en slik SELECT
må returnere resultatet til den ytre konteksten. Det er også begrensninger for bruken av INTO
innenfor UNION
utsagn; se avsnitt 13.2.10.3, «UNION-klausul».
For INTO
-varianten: var_list
-
var_list
navngir en liste over en eller flere variabler, som hver kan være en brukerdefinert variabel, lagret prosedyre eller funksjonsparameter , eller lagret programvariabel. (Innen en forberedtSELECT ... INTO
-erklæring, er bare brukerdefinerte variabler tillatt; se avsnitt 13.6.4.2, «Lokalt variabelt omfang og oppløsning» .)var_list
-
De valgte verdiene tilordnes variablene. Antall variabler må samsvare med antall kolonner. Søket skal returnere en enkelt rad. Hvis spørringen ikke gir noen rader, oppstår en advarsel med feilkode 1329 (
No data
), og variabelverdiene forblir uendret. Hvis spørringen returnerer flere rader, oppstår feil 1172 (Result consisted of more than one row
). Hvis det er mulig at utsagnet kan hente flere rader, kan du brukeLIMIT 1
for å begrense resultatsettet til en enkelt rad.
INTO
kan også være brukt med en var_list
TABLE
-erklæring, underlagt disse begrensningene:
-
Antall variabler må samsvare med antall kolonner i tabellen.
-
Hvis tabellen inneholder mer enn én rad, må du bruke
LIMIT 1
for å begrense resultatsettet til en enkelt rad.LIMIT 1
må gå foranINTO
nøkkelordet.
Et eksempel av en slik påstand er vist her:
Du kan også velge verdier fra en VALUES
-uttalelse som genererer en enkelt rad i et sett med brukervariabler. I dette tilfellet må du bruke et tabellalias, og du må tilordne hver verdi fra verdilisten til en variabel. Hver av de to setningene som vises her tilsvarer SET @x=2, @y=4, @z=8
:
Navn på brukervariabler er ikke store og små bokstaver . Se avsnitt 9.4, «Brukerdefinerte variabler».
SELECT ... INTO OUTFILE "
form av file_name
"SELECT
skriver de valgte radene til en fil. Filen opprettes på serververten, så du må ha FILE
privilegium for å bruke denne syntaksen. file_name
kan ikke være en eksisterende fil, som blant annet forhindrer at filer som /etc/passwd
og databasetabeller endres. character_set_filesystem
systemvariabelen styrer tolkningen av filnavnet.
Uttalelsen SELECT ... INTO OUTFILE
er ment å muliggjøre dumping av en tabell til en tekstfil på serververten.For å opprette den resulterende filen på en annen vert, er SELECT ... INTO OUTFILE
vanligvis uegnet fordi det ikke er mulig å skrive en bane til filen i forhold til serverens vertsfilsystem, med mindre stedet for filen på den eksterne verten kan nås ved hjelp av en nettverkskartet bane på serverens vertsfilsystem.
Alternativt, hvis MySQL-klientprogramvaren er installert på den eksterne verten, kan du bruke en klientkommando som mysql -e "SELECT ..." >
for å generere filen på den verten. file_name
SELECT ... INTO OUTFILE
er komplementet til LOAD DATA
. Kolonneverdier skrives omgjort til tegnsettet som er spesifisert i CHARACTER SET
-satsen. Hvis det ikke er noen slik ledd, dumpes verdier ved hjelp av tegnsettet binary
. Det er faktisk ingen tegnsettkonvertering. Hvis et resultatsett inneholder kolonner i flere tegnsett, er det også utdatafilen, og det er kanskje ikke mulig å laste filen på nytt.
Syntaksen for export_options
-delen av utsagnet består av samme FIELDS
og LINES
klausuler som brukes med LOAD DATA
uttalelsen. For informasjon om FIELDS
og LINES
klausuler, inkludert standardverdier og tillatte verdier, se avsnitt 13.2.7, «LOAD DATA Statement» .
FIELDS ESCAPED BY
styrer hvordan spesialtegn skal skrives. Hvis FIELDS ESCAPED BY
-tegnet ikke er tomt, brukes det når nødvendig for å unngå tvetydighet som et prefiks som går foran følgende tegn på utdata:
-
FIELDS ESCAPED BY
karakter -
FIELDS ENCLOSED BY
tegnet -
Det første tegnet i
FIELDS TERMINATED BY
ogLINES TERMINATED BY
verdier -
ASCII
NUL
(nullverdien byte; det som faktisk skrives etter flukttegnet er ASCII0
, ikke en nullverdi byte)
FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, eller LINES TERMINATED BY
tegn må unnslippes slik at du kan lese filen inn på en pålitelig måte. ASCII NUL
unngås for å gjøre det lettere å se på noen personsøkere.
Den resulterende filen trenger ikke å være i samsvar med SQL-syntaksen, så ingenting annet trenger å unngås.
Hvis FIELDS ESCAPED BY
-tegnet er tomt, unnslippes ingen tegn, og NULL
sendes ut som NULL
, ikke \N
. Det er sannsynligvis ikke en god ide å spesifisere et tomt rømningstegn, spesielt hvis feltverdiene i dataene dine inneholder noen av tegnene i listen akkurat gitt.
INTO OUTFILE
kan også brukes med en TABLE
-uttalelse når du vil dumpe alle kolonnene i en tabell til en tekstfil. I dette tilfellet kan rekkefølgen og antall rader kontrolleres ved hjelp av ORDER BY
og LIMIT
; disse leddene må gå foran INTO OUTFILE
. TABLE ... INTO OUTFILE
støtter den samme export_options
som SELECT ... INTO OUTFILE
, og den er underlagt de samme begrensningene på å skrive til filsystemet. Et eksempel på en slik uttalelse er vist her:
Du kan også bruke SELECT ... INTO OUTFILE
med en VALUES
uttalelse for å skrive verdier direkte inn i en fil. Et eksempel vises her:
Du må bruke et tabellalias; kolonnealiaser støttes også, og kan valgfritt bare brukes til å skrive verdier fra ønskede kolonner. Du kan også bruke alle eller alle eksportalternativene som støttes av SELECT ... INTO OUTFILE
for å formatere utdataene til filen.
Her er et eksempel som produserer en fil i kommaseparerte verdier (CSV) -format som brukes av mange programmer:
Hvis du bruker INTO DUMPFILE
i stedet for INTO OUTFILE
, skriver MySQL bare en rad i filen, uten kolonne- eller linjeavslutning og uten å utføre noen rømningsbehandling. Dette er nyttig for å velge en BLOB
-verdi og lagre den i en fil.
Enhver fil opprettet av INTO OUTFILE
eller INTO DUMPFILE
eies av operativsystembrukeren under hvis konto mysqld kjører. (Du bør aldri kjøre mysqld som root
av dette og andre grunner.) Fra og med MySQL 8.0.17 er oppgaven for filoppretting 0640; du må ha tilstrekkelige tilgangsrettigheter for å manipulere filinnholdet. Før MySQL 8.0.17 er umask 0666 og filen kan skrives av alle brukere på serververten.
Hvis secure_file_priv
systemvariabelen er satt til et ikke-kalt katalognavn, må filen som skal skrives, være i den katalogen.
I sammenheng med SELECT ... INTO
utsagn som oppstår som en del av hendelser utført av hendelsesplanleggeren, skrives diagnosemeldinger (ikke bare feil, men også advarsler) til feilloggen , og på Windows, til programhendelsesloggen. For ytterligere informasjon, se Avsnitt 25.4.5, «Event Scheduler Status».
Fra og med MySQL 8.0.22 gis det støtte for periodisk synkronisering av utdatafiler skrevet til SELECT INTO OUTFILE
og SELECT INTO DUMPFILE
, aktivert ved å sette select_into_disk_sync
server systemvariabelen introdusert i den versjonen. Utgangsbufferstørrelse og valgfri forsinkelse kan sett med henholdsvis select_into_buffer_size
og select_into_disk_sync_delay
. For mer informasjon, se beskrivelsene av disse systemvariablene.