13.2.10.1 SELECT .. INTO-uttalande
SELECT ... INTO
form av SELECT
aktiverar ett sökresultat som ska lagras i variabler eller skrivas till en fil:
-
SELECT ... INTO
väljer kolumnvärden och lagrar dem i variabler.var_list
-
SELECT ... INTO OUTFILE
skriver de valda raderna till en fil. Kolumn- och linjeterminatorer kan specificeras för att producera ett specifikt utdataformat. -
SELECT ... INTO DUMPFILE
skriver en enda rad till en fil utan någon formatering.
Ett givet SELECT
-uttalande kan högst innehålla en INTO
-sats, men som visas av SELECT
syntaxbeskrivning (se avsnitt 13.2.10,” SELECT Statement ”), INTO
kan visas i olika positioner:
-
Före
FROM
. Exempel: -
Före en efterföljande låsningsklausul. Exempel:
-
I slutet av
SELECT
. Exempel:
INTO
position i slutet av uttalandet stöds från och med MySQL 8.0.20, och är den föredragna positionen. Positionen före en låsningsklausul upphör att gälla från och med MySQL 8.0.20; förvänta dig att support för den tas bort i af uture version av MySQL. Med andra ord INTO
efter FROM
men inte i slutet av SELECT
varning.
En INTO
-sats bör inte användas i en kapslad SELECT
eftersom en sådan SELECT
måste återföra sitt resultat till det yttre sammanhanget. Det finns också begränsningar för användningen av INTO
inom UNION
uttalanden; se avsnitt 13.2.10.3, ”UNION Clause”.
För INTO
-varianten: var_list
-
var_list
namnger en lista med en eller flera variabler, var och en kan vara en användardefinierad variabel, lagrad procedur eller funktionsparameter , eller lagrad programvariabel. (Inom en förbereddSELECT ... INTO
är endast användardefinierade variabler tillåtna; se avsnitt 13.6.4.2, ”Lokalt variabelt omfång och upplösning” .)var_list
-
De valda värdena tilldelas variablerna. Antalet variabler måste matcha antalet kolumner. Frågan ska returnera en enda rad. Om frågan inte returnerar några rader inträffar en varning med felkod 1329 (
No data
) och variabelvärdena förblir oförändrade. Om frågan returnerar flera rader, uppstår fel 1172 (Result consisted of more than one row
). Om det är möjligt att uttalandet kan hämta flera rader kan du användaLIMIT 1
för att begränsa resultatuppsättningen till en rad.
INTO
kan också används med ett var_list
TABLE
uttalande, med förbehåll för dessa begränsningar:
-
Antalet variabler måste matcha antalet kolumner i tabellen.
-
Om tabellen innehåller mer än en rad måste du använda
LIMIT 1
för att begränsa resultatuppsättningen till en rad.LIMIT 1
måste föregåINTO
nyckelordet.
Ett exempel av ett sådant uttalande visas här:
Du kan också välja värden från ett VALUES
-uttalande som genererar en en rad i en uppsättning användarvariabler. I det här fallet måste du använda ett tabellalias och du måste tilldela varje värde från värdelistan till en variabel. Var och en av de två påståendena som visas här motsvarar SET @x=2, @y=4, @z=8
:
Användarvariabelnamn är inte skiftlägeskänsliga . Se avsnitt 9.4, ”Användardefinierade variabler”.
SELECT ... INTO OUTFILE "
form av file_name
"SELECT
skriver de valda raderna till en fil. Filen skapas på servervärden, så du måste ha behörigheten FILE
för att kunna använda denna syntax. file_name
kan inte vara en befintlig fil, vilket bland annat förhindrar att filer som /etc/passwd
och databastabeller ändras. Systemvariabeln character_set_filesystem
styr tolkningen av filnamnet.
Uttrycket SELECT ... INTO OUTFILE
är avsett att möjliggöra dumpning av en tabell till en textfil på servervärden.För att skapa den resulterande filen på någon annan värd är SELECT ... INTO OUTFILE
normalt olämplig eftersom det inte finns något sätt att skriva en sökväg till filen i förhållande till serverns värdsystem, såvida inte platsen för fil på fjärrvärden kan nås med en nätverksmappad sökväg på serverns värdfilsystem.
Alternativt, om MySQL-klientprogramvaran är installerad på fjärrvärden, kan du använda ett klientkommando som mysql -e "SELECT ..." >
för att generera filen på den värden. file_name
SELECT ... INTO OUTFILE
är komplementet till LOAD DATA
. Kolumnvärden skrivs omvandlas till teckenuppsättningen som anges i CHARACTER SET
-satsen. Om det inte finns någon sådan sats dumpas värdena med binary
teckenuppsättning. I själva verket finns det ingen teckenuppsättningskonvertering. Om en resultatuppsättning innehåller kolumner i flera teckenuppsättningar är det också utdatafilen och det är kanske inte möjligt att ladda om filen korrekt.
Syntaxen för export_options
-delen av uttalandet består av samma FIELDS
och LINES
klausuler som används med LOAD DATA
uttalande. För information om FIELDS
och LINES
klausuler, inklusive standardvärden och tillåtna värden, se avsnitt 13.2.7, ”LOAD DATA Statement” .
FIELDS ESCAPED BY
styr hur specialtecken ska skrivas. Om FIELDS ESCAPED BY
-tecknet inte är tomt används det när nödvändigt för att undvika tvetydighet som ett prefix som föregår följande tecken på utdata:
-
FIELDS ESCAPED BY
karaktär -
FIELDS ENCLOSED BY
karaktär -
Den första karaktären i
FIELDS TERMINATED BY
ochLINES TERMINATED BY
värden -
ASCII
NUL
(nollvärderad byte; vad som faktiskt skrivs efter flyktecknet är ASCII0
, inte en nollvärderad byte)
FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, eller LINES TERMINATED BY
tecken måste slippas så att du kan läsa in filen på ett tillförlitligt sätt. ASCII NUL
undviks för att göra det lättare att se med vissa personsökare.
Den resulterande filen behöver inte överensstämma med SQL-syntax, så inget annat behöver undvikas.
Om FIELDS ESCAPED BY
-tecknet är tomt undgår inga tecken och NULL
matas ut som NULL
, inte \N
. Det är förmodligen inte en bra idé att ange ett tomt escape-tecken, speciellt om fältvärdena i dina data innehåller något av de tecken som listats just.
INTO OUTFILE
kan också användas med ett TABLE
-uttalande när du vill dumpa alla kolumner i en tabell i ett textfil. I detta fall kan ordningen och antalet rader kontrolleras med ORDER BY
och LIMIT
; dessa klausuler måste föregå INTO OUTFILE
. TABLE ... INTO OUTFILE
stöder samma export_options
som SELECT ... INTO OUTFILE
, och det är föremål för samma begränsningar om att skriva till filsystemet. Ett exempel på ett sådant uttalande visas här:
Du kan också använda SELECT ... INTO OUTFILE
med ett VALUES
uttalande för att skriva värden direkt i en fil. Ett exempel visas här:
Du måste använda ett tabellalias; kolumnalias stöds också och kan valfritt användas för att bara skriva värden från önskade kolumner. Du kan också använda något av eller alla exportalternativ som stöds av SELECT ... INTO OUTFILE
för att formatera utdata till filen.
Här är ett exempel som producerar en fil i formatet kommaseparerade värden (CSV) som används av många program:
Om du använder INTO DUMPFILE
istället för INTO OUTFILE
, skriver MySQL bara en rad i filen, utan någon kolumn eller radavslutning och utan att utföra någon escape-bearbetning. Detta är användbart för att välja ett BLOB
-värde och lagra det i en fil.
Alla filer som skapats av INTO OUTFILE
eller INTO DUMPFILE
ägs av operativsystemanvändaren under vars konto mysqld körs. (Du bör aldrig köra mysqld som root
av detta och andra skäl.) Från och med MySQL 8.0.17 är uppgiften för filskapande 0640; du måste ha tillräcklig åtkomstbehörighet för att manipulera filinnehållet. Före MySQL 8.0.17 är umask 0666 och filen kan skrivas av alla användare på servervärden.
Om secure_file_priv
-systemvariabeln är inställd på ett icke-kortsiktigt katalognamn måste filen som ska skrivas placeras i den katalogen.
I samband med SELECT ... INTO
uttalanden som inträffar som en del av händelser som utförs av Event Scheduler, skrivs diagnosmeddelanden (inte bara fel utan även varningar) till felloggen , och i Windows till applikationshändelseloggen. Mer information finns i avsnitt 25.4.5, ”Event Scheduler Status”.
Från och med MySQL 8.0.22 tillhandahålls stöd för periodisk synkronisering av utdatafiler skrivna till av SELECT INTO OUTFILE
och SELECT INTO DUMPFILE
, aktiverat genom att ställa in select_into_disk_sync
serverns systemvariabel introducerad i den versionen. Utmatningsbuffertstorlek och valfri fördröjning kan ställ in med respektive select_into_buffer_size
och select_into_disk_sync_delay
. För mer information, se beskrivningarna av dessa systemvariabler.