13.2.10.1 SELECT .. . INTO-verklaring
De SELECT ... INTO
vorm van SELECT
maakt een zoekresultaat dat in variabelen moet worden opgeslagen of naar een bestand moet worden geschreven:
-
SELECT ... INTO
selecteert kolomwaarden en slaat ze op in variabelen.var_list
-
SELECT ... INTO OUTFILE
schrijft de geselecteerde rijen naar een bestand. Kolom- en regelafsluiters kunnen worden gespecificeerd om een specifiek uitvoerformaat te produceren. -
SELECT ... INTO DUMPFILE
schrijft een enkele rij naar een bestand zonder enige opmaak.
Een gegeven SELECT
-instructie kan maximaal één INTO
-clausule bevatten, hoewel zoals weergegeven door de SELECT
syntaxisbeschrijving (zie Paragraaf 13.2.10,” SELECT-instructie “), de INTO
kan op verschillende posities verschijnen:
-
Voor
FROM
. Voorbeeld: -
Voor een afsluitende vergrendeling. Voorbeeld:
-
Aan het einde van de
SELECT
. Voorbeeld:
De INTO
positie aan het einde van de verklaring wordt ondersteund vanaf MySQL 8.0.20, en is de voorkeurspositie. De positie vóór een vergrendelingsclausule is verouderd vanaf MySQL 8.0.20; verwacht dat ondersteuning ervoor zal worden verwijderd in af uture-versie van MySQL. Met andere woorden, INTO
na FROM
maar niet aan het einde van de SELECT
produceert een waarschuwing.
Een INTO
-clausule mag niet worden gebruikt in een geneste SELECT
omdat zo’n SELECT
moet het resultaat terugbrengen naar de uiterlijke context. Er zijn ook beperkingen aan het gebruik van INTO
binnen UNION
instructies; zie Paragraaf 13.2.10.3, “UNION-clausule”.
Voor de INTO
variant: var_list
-
var_list
noemt een lijst van een of meer variabelen, die elk een door de gebruiker gedefinieerde variabele, een opgeslagen procedure of een functieparameter kunnen zijn , of een lokale variabele van het opgeslagen programma. (Binnen een voorbereideSELECT ... INTO
-instructie zijn alleen door de gebruiker gedefinieerde variabelen toegestaan; zie Paragraaf 13.6.4.2, “Bereik en oplossing van lokale variabele” .)var_list
-
De geselecteerde waarden worden toegewezen aan de variabelen. Het aantal variabelen moet overeenkomen met het aantal kolommen. De query moet een enkele rij retourneren. Als de query geen rijen retourneert, verschijnt er een waarschuwing met foutcode 1329 (
No data
) en blijven de variabelewaarden ongewijzigd. Als de query meerdere rijen retourneert, treedt fout 1172 op (Result consisted of more than one row
). Als het mogelijk is dat de instructie meerdere rijen ophaalt, kunt uLIMIT 1
gebruiken om de resultatenset te beperken tot een enkele rij.
INTO
kan ook gebruikt met een var_list
TABLE
statement, onderhevig aan deze beperkingen:
-
Het aantal variabelen moeten overeenkomen met het aantal kolommen in de tabel.
-
Als de tabel meer dan één rij bevat, moet u
LIMIT 1
gebruiken om de resultatenset tot één rij te beperken.LIMIT 1
moet voorafgaan aan hetINTO
trefwoord.
Een voorbeeld van een dergelijke verklaring wordt hier weergegeven:
U kunt ook waarden selecteren uit een VALUES
-instructie die een enkele rij in een set gebruikersvariabelen. In dit geval moet u een tabelalias gebruiken en moet u elke waarde uit de waardenlijst aan een variabele toewijzen. Elk van de twee hier getoonde instructies is gelijk aan SET @x=2, @y=4, @z=8
:
Namen van gebruikersvariabelen zijn niet hoofdlettergevoelig . Zie Paragraaf 9.4, “Door de gebruiker gedefinieerde variabelen”.
De SELECT ... INTO OUTFILE "
vorm van file_name
"SELECT
schrijft de geselecteerde rijen naar een bestand. Het bestand is aangemaakt op de serverhost, dus u moet het recht FILE
hebben om deze syntaxis te gebruiken. file_name
kan geen bestaand bestand zijn, wat onder andere voorkomt dat bestanden zoals /etc/passwd
en databasetabellen worden gewijzigd. De systeemvariabele character_set_filesystem
bepaalt de interpretatie van de bestandsnaam.
De SELECT ... INTO OUTFILE
instructie is bedoeld om het dumpen van een tabel naar een tekstbestand op de serverhost mogelijk te maken.Om het resulterende bestand op een andere host te maken, is SELECT ... INTO OUTFILE
normaal gesproken ongeschikt omdat er geen manier is om een pad naar het bestand te schrijven ten opzichte van het serverhostbestandssysteem, tenzij de locatie van de bestand op de externe host kan worden geopend via een netwerkpad op het hostbestandssysteem van de server.
Als alternatief, als de MySQL-clientsoftware is geïnstalleerd op de externe host, kunt u een clientopdracht gebruiken zoals mysql -e "SELECT ..." >
om het bestand op die host te genereren. file_name
SELECT ... INTO OUTFILE
is het complement van LOAD DATA
. Kolomwaarden worden geconverteerd naar de tekenset die is opgegeven in de CHARACTER SET
-clausule. Als zo’n clausule niet aanwezig is, worden de waarden gedumpt met behulp van de binary
tekenset. In feite is er geen conversie van de tekenset. Als een resultatenset kolommen in verschillende tekensets bevat, geldt dat ook voor het uitvoergegevensbestand en is het wellicht niet mogelijk om het bestand correct opnieuw te laden.
De syntaxis voor het export_options
-gedeelte van de instructie bestaat uit dezelfde FIELDS
en LINES
clausules die worden gebruikt met de LOAD DATA
instructie. Voor informatie over de clausules FIELDS
en LINES
, inclusief hun standaardwaarden en toegestane waarden, zie Paragraaf 13.2.7, “LOAD DATA-instructie” .
FIELDS ESCAPED BY
bepaalt hoe speciale tekens moeten worden geschreven. Als het FIELDS ESCAPED BY
teken niet leeg is, wordt het gebruikt wanneer noodzakelijk om dubbelzinnigheid te vermijden als een voorvoegsel dat voorafgaat aan de volgende tekens bij uitvoer:
-
Het
FIELDS ESCAPED BY
character -
Het
FIELDS ENCLOSED BY
karakter -
Het eerste karakter van de
FIELDS TERMINATED BY
enLINES TERMINATED BY
waarden -
ASCII
NUL
(de byte met nulwaarde; wat feitelijk wordt geschreven na het escape-teken is ASCII0
, geen byte met nulwaarde)
De FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, of LINES TERMINATED BY
-tekens moeten worden ontsnapt zodat u het bestand betrouwbaar kunt teruglezen. ASCII NUL
is voorzien van escapecodes om het bekijken met sommige pagers gemakkelijker te maken.
Het resulterende bestand hoeft niet te voldoen aan de SQL-syntaxis, dus niets anders hoeft te worden ontsnapt.
Als het FIELDS ESCAPED BY
-teken leeg is, worden er geen tekens geëscaped en wordt NULL
uitgevoerd als NULL
, niet \N
. Het is waarschijnlijk geen goed idee om een leeg escape-teken op te geven, vooral als veldwaarden in uw gegevens een van de tekens uit de zojuist opgegeven lijst bevatten.
INTO OUTFILE
kan ook worden gebruikt met een TABLE
-instructie wanneer u alle kolommen van een tabel in een tekstbestand. In dit geval kunnen de volgorde en het aantal rijen worden beheerd met ORDER BY
en LIMIT
; deze clausules moeten voorafgaan aan INTO OUTFILE
. TABLE ... INTO OUTFILE
ondersteunt dezelfde export_options
als SELECT ... INTO OUTFILE
, en is onderhevig aan dezelfde beperkingen bij het schrijven naar het bestandssysteem. Een voorbeeld van zo’n statement wordt hier getoond:
Je kunt ook SELECT ... INTO OUTFILE
gebruiken met een VALUES
statement om te schrijven waarden rechtstreeks in een bestand. Een voorbeeld wordt hier getoond:
U moet een tabelalias gebruiken; kolomaliassen worden ook ondersteund en kunnen optioneel worden gebruikt om alleen waarden uit de gewenste kolommen te schrijven. U kunt ook een of alle exportopties gebruiken die worden ondersteund door SELECT ... INTO OUTFILE
om de uitvoer naar het bestand te formatteren.
Hier is een voorbeeld dat een bestand produceert in de indeling met door komma’s gescheiden waarden (CSV) die door veel programma’s worden gebruikt:
Als u INTO DUMPFILE
in plaats van INTO OUTFILE
, schrijft MySQL slechts één rij naar het bestand, zonder enige kolom- of regelbeëindiging en zonder enige escape-verwerking uit te voeren. Dit is handig om een BLOB
-waarde te selecteren en deze op te slaan in een bestand.
Elk bestand gemaakt door INTO OUTFILE
of INTO DUMPFILE
is eigendom van de gebruiker van het besturingssysteem onder wiens account mysqld draait. (Je zou mysqld nooit moeten draaien als root
om deze en andere redenen.) Vanaf MySQL 8.0.17 is het umask voor het maken van bestanden 0640; u moet voldoende toegangsrechten hebben om de inhoud van het bestand te manipuleren. Vóór MySQL 8.0.17 is de umask 0666 en kan het bestand worden geschreven door alle gebruikers op de serverhost.
Als de secure_file_priv
systeemvariabele is ingesteld op een niet-lege mapnaam, moet het te schrijven bestand zich in die map bevinden.
In de context van SELECT ... INTO
-instructies die optreden als onderdeel van gebeurtenissen die worden uitgevoerd door de Event Scheduler, worden diagnostische berichten (niet alleen fouten, maar ook waarschuwingen) naar het foutenlogboek geschreven en, in Windows, naar het logboek voor toepassingsgebeurtenissen. Voor meer informatie, zie Paragraaf 25.4.5, “Event Scheduler Status”.
Vanaf MySQL 8.0.22 wordt ondersteuning geboden voor periodieke synchronisatie van outputbestanden die geschreven zijn door SELECT INTO OUTFILE
en SELECT INTO DUMPFILE
, ingeschakeld door de select_into_disk_sync
serversysteemvariabele die in die versie is geïntroduceerd in te stellen. Grootte van uitvoerbuffer en optionele vertraging kunnen worden ingesteld ingesteld met respectievelijk select_into_buffer_size
en select_into_disk_sync_delay
. Zie de beschrijvingen van deze systeemvariabelen voor meer informatie.