MySQL :: MySQL 8.0 Referansehåndbok :: 13.2.10.1 SELECT … INTO Statement

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 var_list velger kolonneverdier og lagrer dem i variabler.

  • 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 var_list -varianten:

  • 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 forberedt SELECT ... INTO var_list -erklæring, er bare brukerdefinerte variabler tillatt; se avsnitt 13.6.4.2, «Lokalt variabelt omfang og oppløsning» .)

  • 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 bruke LIMIT 1 for å begrense resultatsettet til en enkelt rad.

INTO var_list kan også være brukt med en 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å foran INTO 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 "file_name " form av 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 ..." > file_name for å generere filen på den verten.

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 og LINES TERMINATED BY verdier

  • ASCII NUL (nullverdien byte; det som faktisk skrives etter flukttegnet er ASCII 0, 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.

Merk

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.

Write a Comment

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *