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 ... INTOselecteert kolomwaarden en slaat ze op in variabelen.var_list -
SELECT ... INTO OUTFILEschrijft de geselecteerde rijen naar een bestand. Kolom- en regelafsluiters kunnen worden gespecificeerd om een specifiek uitvoerformaat te produceren. -
SELECT ... INTO DUMPFILEschrijft 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_listnoemt 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 1gebruiken 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 1gebruiken om de resultatenset tot één rij te beperken.LIMIT 1moet voorafgaan aan hetINTOtrefwoord.
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 BYcharacter -
Het
FIELDS ENCLOSED BYkarakter -
Het eerste karakter van de
FIELDS TERMINATED BYenLINES TERMINATED BYwaarden -
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.