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
vælger kolonneværdier og gemmer dem i variabler.var_list
-
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
-variant: var_list
-
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 forberedtSELECT ... INTO
-erklæring er kun brugerdefinerede variabler tilladt; se afsnit 13.6.4.2, “Lokal variabel rækkevidde og opløsning” .)var_list
-
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 brugeLIMIT 1
til at begrænse resultatsættet til en enkelt række.
INTO
kan også være brugt med en var_list
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å foranINTO
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 "
form af file_name
"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 ..." >
for at generere filen på den vært. file_name
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
ogLINES TERMINATED BY
værdier -
ASCII
NUL
(den nul-værdiansatte byte; hvad der faktisk skrives efter flugttegnet er ASCII0
, 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.
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.