MySQL :: MySQL 8.0 Reference Manual :: 13.2.10.1 SELECT … INTO Statement

13.2.10.1 SELECT .. . PROHLÁŠENÍ

SELECT ... INTO forma SELECT umožňuje výsledek dotazu, který má být uložen v proměnných nebo zapsán do souboru:

  • SELECT ... INTO var_list vybere hodnoty sloupců a uloží je do proměnných.

  • SELECT ... INTO OUTFILE zapíše vybrané řádky do souboru. K vytvoření konkrétního výstupního formátu lze zadat zakončení sloupců a řádků.

  • SELECT ... INTO DUMPFILE zapíše do souboru jeden řádek bez jakéhokoli formátování.

Daný příkaz SELECT může obsahovat maximálně jednu klauzuli INTO, i když to ukazuje SELECT popis syntaxe (viz Oddíl 13.2.10,„ Příkaz SELECT “), INTO se může objevit na různých pozicích:

  • Před FROM. Příklad:

  • Před koncovou blokovací klauzulí. Příklad:

  • Na konci SELECT. Příklad:

INTO Pozice na konci příkazu je podporována od MySQL 8.0.20 a je preferovanou pozicí. Pozice před zamykací klauzulí je zastaralá od MySQL 8.0.20; očekávejte, že bude podpora odstraněna v af čistá verze MySQL. Jinými slovy, INTO po FROM, ale ne na konci SELECT vytvoří Varování.

Klauzule INTO by neměla být použita ve vnořené SELECT, protože taková SELECT musí vrátit svůj výsledek do vnějšího kontextu. Existují také omezení týkající se použití INTO v rámci UNION prohlášení; viz Oddíl 13.2.10.3, „Klauzule UNION“.

Varianta INTO var_list :

  • var_list pojmenuje seznam jedné nebo více proměnných, z nichž každá může být uživatelem definovaná proměnná, uložená procedura nebo parametr funkce nebo uložená místní proměnná programu. (V rámci připraveného příkazu SELECT ... INTO var_list jsou povoleny pouze uživatelem definované proměnné; viz Oddíl 13.6.4.2, „Rozsah a rozlišení lokálních proměnných“ .)

  • Vybrané hodnoty jsou přiřazeny proměnným. Počet proměnných se musí shodovat s počtem sloupců. Dotaz by měl vrátit jeden řádek. Pokud dotaz nevrátí žádné řádky, objeví se varování s kódem chyby 1329 (No data) a hodnoty proměnných zůstanou nezměněny. Pokud dotaz vrátí více řádků, dojde k chybě 1172 (Result consisted of more than one row). Pokud je možné, že příkaz může načíst více řádků, můžete pomocí LIMIT 1 omezit sadu výsledků na jeden řádek.

INTO var_list může být také používá se s TABLE s výhradou těchto omezení:

  • Počet proměnné se musí shodovat s počtem sloupců v tabulce.

  • Pokud tabulka obsahuje více než jeden řádek, musíte použít LIMIT 1 k omezení sady výsledků na jeden řádek. LIMIT 1 musí předcházet INTO klíčovému slovu.

Příklad takového prohlášení je zobrazeno zde:

Můžete také vybrat hodnoty z VALUES příkazu, který generuje jeden řádek do sady uživatelských proměnných. V tomto případě musíte použít alias tabulky a každou hodnotu ze seznamu hodnot musíte přiřadit proměnné. Každý ze dvou zde uvedených příkazů je ekvivalentní s SET @x=2, @y=4, @z=8:

Názvy uživatelských proměnných nerozlišují velká a malá písmena . Viz Sekce 9.4, „Uživatelem definované proměnné“.

SELECT ... INTO OUTFILE "file_name " forma SELECT zapíše vybrané řádky do souboru. Soubor je vytvořen na hostiteli serveru, takže k použití této syntaxe musíte mít oprávnění FILE. file_name nemůže být existující soubor, což mimo jiné zabrání úpravám souborů jako /etc/passwd a databázových tabulek. Interpretace character_set_filesystem řídí interpretaci názvu souboru.

Příkaz SELECT ... INTO OUTFILE je určen k povolení výpisu tabulky do textového souboru na hostiteli serveru.Chcete-li vytvořit výsledný soubor na jiném hostiteli, je SELECT ... INTO OUTFILE obvykle nevhodný, protože neexistuje způsob, jak zapsat cestu k souboru ve vztahu k systému souborů hostitele serveru, pokud umístění umístění k souboru na vzdáleném hostiteli lze přistupovat pomocí síťově mapované cesty v systému souborů hostitele serveru.

Alternativně, pokud je klientský software MySQL nainstalován na vzdáleném hostiteli, můžete použít příkaz klienta, například mysql -e "SELECT ..." > file_name vygenerovat soubor na tomto hostiteli.

SELECT ... INTO OUTFILE je doplňkem LOAD DATA. Hodnoty sloupců se zapisují převedené na znakovou sadu uvedenou v klauzuli CHARACTER SET. Pokud taková klauzule není k dispozici, jsou hodnoty vypsány pomocí znakové sady binary. Ve skutečnosti neexistuje žádná konverze znakové sady. Pokud výsledková sada obsahuje sloupce v několika znakových sadách, je to i výstupní datový soubor a nemusí být možné soubor znovu správně načíst.

Syntaxe export_options části příkazu se skládá ze stejných FIELDS a LINES klauzule, které se používají s příkazem LOAD DATA. Informace o klauzulích FIELDS a LINES, včetně jejich výchozích hodnot a povolených hodnot, viz Oddíl 13.2.7, „Prohlášení o LOAD DATA“ .

FIELDS ESCAPED BY určuje, jak psát speciální znaky. Pokud znak FIELDS ESCAPED BY není prázdný, použije se, když je nutné se vyhnout nejednoznačnosti jako předpony, která předchází následující znaky na výstupu:

  • FIELDS ESCAPED BY znak

  • FIELDS ENCLOSED BY znak

  • První znak FIELDS TERMINATED BY a LINES TERMINATED BY hodnoty

  • ASCII NUL (bajt s nulovou hodnotou; to, co je vlastně napsáno za únikovým znakem, je ASCII 0, nikoli bajt s nulovou hodnotou)

FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY , nebo LINES TERMINATED BY znaků musí být ukončeno, aby bylo možné soubor spolehlivě přečíst zpět. ASCII NUL je vynechán, aby se usnadnilo prohlížení u některých pagerů.

Výsledný soubor nemusí odpovídat syntaxi SQL, takže není třeba nic jiného unikat.

Pokud je znak FIELDS ESCAPED BY prázdný, žádné znaky neuniknou a NULL se vydá jako NULL, nikoli \N. Pravděpodobně není dobrý nápad zadat prázdný řídicí znak, zvláště pokud hodnoty polí ve vašich datech obsahují některý ze znaků v právě zadaném seznamu.

INTO OUTFILE lze také použít s příkazem TABLE, pokud chcete vypsat všechny sloupce tabulky do textový soubor. V takovém případě lze pořadí a počet řádků řídit pomocí ORDER BY a LIMIT; tyto klauzule musí předcházet INTO OUTFILE. TABLE ... INTO OUTFILE podporuje stejné export_options stejně jako SELECT ... INTO OUTFILE a podléhá stejným omezením při zápisu do systému souborů. Příklad takového prohlášení je uveden zde:

Můžete také použít SELECT ... INTO OUTFILE s VALUES příkazem hodnoty přímo do souboru. Zde je uveden příklad:

Musíte použít alias tabulky; Aliasy sloupců jsou také podporovány a lze je volitelně použít k zápisu hodnot pouze z požadovaných sloupců. K formátování výstupu do souboru můžete také použít libovolnou nebo všechny možnosti exportu podporované SELECT ... INTO OUTFILE.

Zde je příklad, který vytváří soubor ve formátu hodnot oddělených čárkami (CSV), který používá mnoho programů:

Pokud používáte INTO DUMPFILE namísto INTO OUTFILE MySQL zapíše do souboru pouze jeden řádek, bez ukončení sloupce nebo řádku a bez provedení únikového zpracování. To je užitečné pro výběr hodnoty BLOB a její uložení do souboru.

Poznámka

Jakýkoli soubor vytvořený INTO OUTFILE nebo INTO DUMPFILE je ve vlastnictví uživatele operačního systému, pod jehož účtem běží mysqld. (Z tohoto a dalších důvodů byste nikdy neměli spouštět mysqld jako root.) Od verze MySQL 8.0.17 je umask pro vytváření souborů 0640; k manipulaci s obsahem souboru musíte mít dostatečná přístupová oprávnění. Před MySQL 8.0.17 je umask 0666 a do souboru je možné zapisovat všichni uživatelé na hostiteli serveru.

Pokud je systémová proměnná secure_file_priv nastavena na neprázdný název adresáře, musí být soubor, který má být zapsán, umístěn v tomto adresáři.

V kontextu SELECT ... INTO příkazů, které se vyskytují jako součást událostí prováděných plánovačem událostí, se do protokolu chyb zapisují diagnostické zprávy (nejen chyby, ale také varování). a v systému Windows do protokolu událostí aplikace. Další informace najdete v části 25.4.5, „Stav plánovače událostí“.

Od verze MySQL 8.0.22 je poskytována podpora pro pravidelnou synchronizaci výstupních souborů zapsaných do souboru SELECT INTO OUTFILE a SELECT INTO DUMPFILE, povoleno nastavením systémové proměnné serveru select_into_disk_sync zavedené v této verzi. Velikost výstupní vyrovnávací paměti a volitelné zpoždění mohou být nastavit pomocí select_into_buffer_size a select_into_disk_sync_delay. Další informace najdete v popisech těchto systémových proměnných.

Write a Comment

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *