MySQL :: MySQL 8.0 Referenshandbok :: 13.2.10.1 SELECT … INTO-uttalande

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 var_list väljer kolumnvärden och lagrar dem i variabler.

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

  • 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örberedd SELECT ... INTO var_list är endast användardefinierade variabler tillåtna; se avsnitt 13.6.4.2, ”Lokalt variabelt omfång och upplösning” .)

  • 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ända LIMIT 1 för att begränsa resultatuppsättningen till en rad.

INTO var_list kan också används med ett 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 "file_name " form av 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 ..." > file_name för att generera filen på den värden.

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 och LINES TERMINATED BY värden

  • ASCII NUL (nollvärderad byte; vad som faktiskt skrivs efter flyktecknet är ASCII 0, 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.

Obs

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.

Write a Comment

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *