MySQL :: MySQL 8.0 Referencehåndbog :: 13.2.10.1 SELECT … INTO Statement

13.2.10.1 SELECT .. INTO-erklæring

SELECT ... INTO form af SELECT muliggør et forespørgselsresultat, der skal gemmes i variabler eller skrives til en fil:

  • SELECT ... INTO var_list vælger kolonneværdier og gemmer dem i variabler.

  • SELECT ... INTO OUTFILE skriver de valgte rækker til en fil. Kolonne- og linjeterminatorer kan specificeres for at producere et specifikt outputformat.

  • SELECT ... INTO DUMPFILE skriver en enkelt række til en fil uden nogen formatering.

En given SELECT sætning kan højst indeholde en INTO -sætning, selvom som vist ved SELECT beskrivelse af syntaks (se afsnit 13.2.10,” SELECT Statement “), INTO kan vises i forskellige positioner:

  • Før FROM. Eksempel:

  • Før en efterfølgende låseklausul. Eksempel:

  • I slutningen af SELECT. Eksempel:

INTO position i slutningen af erklæringen understøttes fra MySQL 8.0.20 og er den foretrukne position. Positionen før en låseklausul udfases fra MySQL 8.0.20; forvent support til at blive fjernet i af uure version af MySQL. Med andre ord INTO efter FROM men ikke i slutningen af SELECT advarsel.

En INTO -klausul bør ikke bruges i en indlejret SELECT fordi sådan en SELECT skal returnere sit resultat til den ydre kontekst. Der er også begrænsninger for brugen af INTO inden for UNION udsagn; se afsnit 13.2.10.3, “UNION-klausul”.

For INTO var_list -variant:

  • var_list navngiver en liste med en eller flere variabler, som hver kan være en brugerdefineret variabel, lagret procedure eller funktionsparameter eller den gemte programvariabel (inden for en forberedt SELECT ... INTO var_list -erklæring er kun brugerdefinerede variabler tilladt; se afsnit 13.6.4.2, “Lokal variabel rækkevidde og opløsning” .)

  • De valgte værdier tildeles variablerne. Antallet af variabler skal matche antallet af kolonner. Forespørgslen skal returnere en enkelt række. Hvis forespørgslen ikke returnerer nogen rækker, opstår en advarsel med fejlkode 1329 (No data), og variabelværdierne forbliver uændrede. Hvis forespørgslen returnerer flere rækker, opstår fejl 1172 (Result consisted of more than one row). Hvis det er muligt, at udsagnet kan hente flere rækker, kan du bruge LIMIT 1 til at begrænse resultatsættet til en enkelt række.

INTO var_list kan også være brugt med en TABLE -erklæring med forbehold af disse begrænsninger:

  • Antallet af variabler skal matche antallet af kolonner i tabellen.

  • Hvis tabellen indeholder mere end en række, skal du bruge LIMIT 1 for at begrænse resultatsættet til en enkelt række. LIMIT 1 skal gå foran INTO nøgleordet.

Et eksempel af en sådan udsagn vises her:

Du kan også vælge værdier fra en VALUES -sætning, der genererer en enkelt række i et sæt brugervariabler. I dette tilfælde skal du anvende et tabelalias, og du skal tildele hver værdi fra værdilisten til en variabel. Hver af de to udsagn, der vises her, svarer til SET @x=2, @y=4, @z=8:

Navn på brugervariabler er ikke store og små bogstaver . Se afsnit 9.4, “Brugerdefinerede variabler”.

SELECT ... INTO OUTFILE "file_name " form af SELECT skriver de valgte rækker til en fil. Filen oprettes på serverværten, så du skal have privilegiet FILE for at bruge denne syntaks. file_name kan ikke være en eksisterende fil, hvilket blandt andet forhindrer ændringer i filer såsom /etc/passwd og databasetabeller. character_set_filesystem systemvariablen styrer fortolkningen af filnavnet.

Erklæringen SELECT ... INTO OUTFILE er beregnet til at muliggøre dumping af en tabel til en tekstfil på serverværten.For at oprette den resulterende fil på en anden vært er SELECT ... INTO OUTFILE normalt uegnet, fordi der ikke er nogen måde at skrive en sti til filen i forhold til serverværtsfilsystemet, medmindre placeringen af fil på den eksterne vært kan tilgås ved hjælp af en netværkskortlagt sti på serverens værtsfilsystem.

Alternativt, hvis MySQL-klientsoftwaren er installeret på den eksterne vært, kan du bruge en klientkommando som mysql -e "SELECT ..." > file_name for at generere filen på den vært.

SELECT ... INTO OUTFILE er komplementet til LOAD DATA. Kolonneværdier skrives konverteret til det tegnsæt, der er specificeret i CHARACTER SET -sætningen. Hvis der ikke findes en sådan klausul, dumpes værdier ved hjælp af tegnsættet binary. Der er faktisk ingen tegnsætskonvertering. Hvis et resultatsæt indeholder kolonner i flere tegnsæt, er outputdatafilen det også, og det er muligvis ikke muligt at genindlæse filen korrekt.

Syntaksen for export_options -delen af udsagnet består af den samme FIELDS og LINES klausuler, der bruges med LOAD DATA udsagnet. For oplysninger om FIELDS og LINES klausuler, inklusive deres standardværdier og tilladte værdier, se afsnit 13.2.7, “LOAD DATA Statement” .

FIELDS ESCAPED BY styrer, hvordan specialtegn skal skrives. Hvis FIELDS ESCAPED BY -tegnet ikke er tomt, bruges det når nødvendigt for at undgå tvetydighed som et præfiks, der går forud for følgende tegn på output:

  • FIELDS ESCAPED BY karakter

  • FIELDS ENCLOSED BY tegn

  • Det første tegn i FIELDS TERMINATED BY og LINES TERMINATED BY værdier

  • ASCII NUL (den nul-værdiansatte byte; hvad der faktisk skrives efter flugttegnet er ASCII 0, ikke en nul-værdi-byte)

FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY , eller LINES TERMINATED BY tegn skal undgås, så du kan læse filen tilbage pålideligt. ASCII NUL er undsluppet for at gøre det lettere at se med nogle personsøgere.

Den resulterende fil behøver ikke at være i overensstemmelse med SQL-syntaks, så intet andet skal undgås.

Hvis FIELDS ESCAPED BY -tegnet er tomt, undgår man ingen tegn, og NULL sendes ud som NULL, ikke \N. Det er sandsynligvis ikke en god ide at angive et tomt escape-tegn, især hvis feltværdier i dine data indeholder et af de tegn, der lige er angivet på listen.

INTO OUTFILE kan også bruges med en TABLE -erklæring, når du vil dumpe alle kolonner i en tabel til en tekstfil. I dette tilfælde kan rækkefølgen og antallet af rækker styres ved hjælp af ORDER BY og LIMIT; disse klausuler skal gå forud for INTO OUTFILE. TABLE ... INTO OUTFILE understøtter den samme export_options som SELECT ... INTO OUTFILE, og den er underlagt de samme begrænsninger ved skrivning til filsystemet. Her vises et eksempel på en sådan erklæring:

Du kan også bruge SELECT ... INTO OUTFILE med en VALUES -erklæring til at skrive værdier direkte i en fil. Her vises et eksempel:

Du skal bruge et tabelalias; kolonne alias understøttes også og kan valgfrit bruges til kun at skrive værdier fra ønskede kolonner. Du kan også bruge en eller alle eksportindstillinger understøttet af SELECT ... INTO OUTFILE til at formatere output til filen.

Her er et eksempel, der producerer en fil i kommaseparerede værdier (CSV) -format, der bruges af mange programmer:

Hvis du bruger INTO DUMPFILE i stedet for INTO OUTFILE, skriver MySQL kun en række ind i filen uden nogen kolonne- eller linjeafslutning og uden at udføre nogen escape-behandling. Dette er nyttigt til at vælge en BLOB -værdi og gemme den i en fil.

Bemærk

Enhver fil oprettet af INTO OUTFILE eller INTO DUMPFILE ejes af operativsystembrugeren, hvis konto mysqld kører. (Du bør aldrig køre mysqld som root af dette og af andre grunde.) Fra og med MySQL 8.0.17 er umask til filoprettelse 0640; du skal have tilstrækkelige adgangsrettigheder til at manipulere filindholdet. Før MySQL 8.0.17 er umask 0666, og filen kan skrives af alle brugere på serverværten.

Hvis secure_file_priv systemvariablen er indstillet til et ikke-forkert katalognavn, skal den fil, der skal skrives, være placeret i den pågældende mappe.

I forbindelse med SELECT ... INTO udsagn, der opstår som en del af begivenheder udført af Event Scheduler, skrives diagnosticeringsmeddelelser (ikke kun fejl, men også advarsler) til fejlloggen , og på Windows til programhændelsesloggen. For yderligere information, se Afsnit 25.4.5, “Status for hændelsesplanlægning”.

Fra og med MySQL 8.0.22 ydes der support til periodisk synkronisering af outputfiler skrevet til af SELECT INTO OUTFILE og SELECT INTO DUMPFILE, aktiveret ved at indstille select_into_disk_sync serversystemvariablen introduceret i den version. Outputbufferstørrelse og valgfri forsinkelse kan indstilles indstilles med henholdsvis select_into_buffer_size og select_into_disk_sync_delay. For mere information, se beskrivelserne af disse systemvariabler.

Write a Comment

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *