MySQL :: MySQL 8.0 Naslaggids :: 13.2.10.1 SELECT … INTO Statement

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 var_list selecteert kolomwaarden en slaat ze op in variabelen.

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

  • 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 voorbereide SELECT ... INTO var_list -instructie zijn alleen door de gebruiker gedefinieerde variabelen toegestaan; zie Paragraaf 13.6.4.2, “Bereik en oplossing van lokale variabele” .)

  • 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 u LIMIT 1 gebruiken om de resultatenset te beperken tot een enkele rij.

INTO var_list kan ook gebruikt met een 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 het INTO 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 "file_name " vorm van 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 ..." > file_name om het bestand op die host te genereren.

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 en LINES TERMINATED BY waarden

  • ASCII NUL (de byte met nulwaarde; wat feitelijk wordt geschreven na het escape-teken is ASCII 0, 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.

Opmerking

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.

Write a Comment

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *