13.2.10.1 SELECT .. . INTO utasítás
A SELECT ... INTO
SELECT
forma engedélyezi a változókban tárolandó vagy fájlba írt lekérdezés eredménye:
-
SELECT ... INTO
kiválasztja az oszlopértékeket és változókba tárolja őket.var_list
-
iv
SELECT ... INTO OUTFILE
a kiválasztott sorokat fájlba írja. Az oszlop- és sorterminálók megadhatók egy adott kimeneti formátum előállításához. -
SELECT ... INTO DUMPFILE
egyetlen sort ír egy fájlba formázás nélkül.
Egy adott SELECT
utasítás legfeljebb egy INTO
záradékot tartalmazhat, bár ezt a szintaxis leírása (lásd: 13.2.10. Szakasz,” SELECT utasítás “), a INTO
különböző pozíciókban jelenhet meg:
-
A
FROM
előtt. Példa: -
A záró záradék előtt. Példa:
-
A
SELECT
. Példa:
A pozíció a MySQL 8.0.20-tól kezdve támogatott, és ez az előnyben részesített pozíció. A zárolási záradék előtti pozíció a MySQL 8.0.20-tól kezdődően megszűnik; elvárható, hogy a támogatás eltávolításra kerüljön af a MySQL uture verziója. Más szóval, INTO
a FROM
után, de a SELECT
végén nem Figyelem.
A INTO
záradékot nem szabad beágyazott SELECT
beilleszteni, mert egy ilyen SELECT
-nek vissza kell adnia eredményét a külső kontextusba. A INTO
használatára is vannak korlátozások a UNION
utasításokban; lásd: 13.2.10.3. szakasz, “UNION klauzula”.
A INTO
variánshoz: var_list
-
var_list
megnevez egy vagy több változó listáját, amelyek mindegyike lehet egy felhasználó által definiált változó, tárolt eljárás vagy függvényparaméter , vagy tárolt program helyi változója. (Az előkészítettSELECT ... INTO
utasításon belül csak a felhasználó által definiált változók engedélyezettek; lásd: 13.6.4.2. szakasz – “Helyi változó hatóköre és felbontása” .)var_list
-
A kiválasztott értékeket a változókhoz rendeljük. A változók számának meg kell egyeznie az oszlopok számával. A lekérdezésnek egyetlen sort kell visszaadnia. Ha a lekérdezés nem ad sorokat, akkor egy figyelmeztetés jelenik meg az 1329 hibakóddal (
No data
), és a változó értékei változatlanok maradnak. Ha a lekérdezés több sort ad vissza, akkor az 1172 hiba lép fel (Result consisted of more than one row
). Ha lehetséges, hogy az utasítás több sort is lekérhet, akkor aLIMIT 1
paranccsal korlátozhatja a beállított eredményt egyetlen sorra.
INTO
is lehet var_list
TABLE
utasítással használható, a következő korlátozásoktól függően:
-
A a változóknak meg kell egyezniük a táblázat oszlopainak számával.
-
Ha a táblázat egynél több sort tartalmaz, akkor a
LIMIT 1
paranccsal korlátozhatja az eredményeket egyetlen sorra. ALIMIT 1
-nek meg kell előznie aINTO
kulcsszót.
Példa egy ilyen állítás itt látható:
Értékeket is kiválaszthat egy VALUES
utasításból, amely egy egyetlen sor a felhasználói változók halmazába. Ebben az esetben egy tábla álnevet kell alkalmaznia, és az értéklista minden értékét hozzá kell rendelnie egy változóhoz. Az itt bemutatott két állítás mindegyike egyenértékű a következővel: SET @x=2, @y=4, @z=8
:
A felhasználói változók neve nem különbözteti meg a kis- és nagybetűket . Lásd: 9.4. Szakasz – “Felhasználó által definiált változók”.
A SELECT
SELECT ... INTO OUTFILE "
forma fájlba írja a kijelölt sorokat. A fájl a kiszolgálón található, így a szintaxis használatához file_name
"FILE
jogosultsággal kell rendelkeznie. A file_name
nem lehet létező fájl, ami többek között megakadályozza az olyan fájlok módosítását, mint az /etc/passwd
és az adatbázis-táblák. A character_set_filesystem
rendszerváltozó vezérli a fájlnév értelmezését.
A SELECT ... INTO OUTFILE
utasítás célja, hogy lehetővé tegye a tábla szöveges fájlba történő átvetését a szerver gazdagépén.A kapott fájl más gazdagépen történő létrehozásához a SELECT ... INTO OUTFILE
általában alkalmatlan, mert a kiszolgáló gazdagép fájlrendszeréhez képest nem lehet útvonalat írni a fájlhoz, kivéve, ha a fájl helye a távoli állomáson található fájlhoz a kiszolgáló gazdagép fájlrendszerének hálózaton feltérképezett elérési útján lehet hozzáférni.
Alternatív megoldásként, ha a MySQL kliens szoftver telepítve van a távoli gazdagépre, használhat egy kliens parancsot, például mysql -e "SELECT ..." >
fájl létrehozásához az adott gazdagépen. file_name
SELECT ... INTO OUTFILE
a LOAD DATA
kiegészítése. Az oszlopértékeket a CHARACTER SET
záradékban megadott karakterkészletre konvertálva írjuk. Ha nincs ilyen záradék, akkor az értékeket a binary
karakterkészlet segítségével vesszük ki. Valójában nincs karakterkészlet-átalakítás. Ha egy eredménykészlet több karakterkészletben tartalmaz oszlopokat, akkor a kimeneti adatfájl is, és előfordulhat, hogy a fájl újratöltése nem lehetséges.
A utasítás export_options
részének szintaxisa ugyanabból a FIELDS
és LINES
záradékok, amelyeket a LOAD DATA
utasítással együtt használnak. A FIELDS
és a LINES
záradékokról, beleértve az alapértelmezett és megengedett értékeket is, lásd a 13.2.7. Szakaszt: “TÖLTÉSI ADATOK Nyilatkozat” .
FIELDS ESCAPED BY
vezérli a speciális karakterek írását. Ha az FIELDS ESCAPED BY
karakter nem üres, akkor szükséges a kétértelműség elkerüléséhez, amely a kimeneten a következő karaktereket megelőzi:
-
A
FIELDS ESCAPED BY
karakter -
A
FIELDS ENCLOSED BY
karakter -
A karakter első karaktere
FIELDS TERMINATED BY
ésLINES TERMINATED BY
értékek -
ASCII
NUL
(a nulla értékű bájt; amit a escape karakter után írunk, az ASCII0
, nem nulla értékű bájt)
A FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, vagy a LINES TERMINATED BY
karaktereket el kell kerülni, hogy megbízhatóan olvashassa vissza a fájlt. Az ASCII NUL
elkerülve van, hogy megkönnyítse néhány lapozóval való megtekintést.
A kapott fájlnak nem kell megfelelnie az SQL szintaxisának, ezért semmi mást nem kell elkerülni.
Ha a FIELDS ESCAPED BY
karakter üres, akkor egyetlen karakter sem kerül elhagyásra, és a NULL
, nem \N
. Valószínűleg nem jó egy üres menekülési karakter megadása, különösen, ha az adatok mezőértékei az imént megadott listában szereplő bármelyik karaktert tartalmazzák.
INTO OUTFILE
egy TABLE
utasítással is használható, ha egy tábla összes oszlopát egy szöveges fájl. Ebben az esetben a sorok sorrendjét és számát a ORDER BY
és a LIMIT
segítségével szabályozhatjuk; ezeknek a záradékoknak meg kell előzniük a INTO OUTFILE
-et. A TABLE ... INTO OUTFILE
ugyanazt a export_options
-t támogatja, mint a SELECT ... INTO OUTFILE
-t, és ugyanazok a korlátozások vonatkoznak rá az iratrendszerbe történő írásról. Itt látható egy példa egy ilyen állításra:
Használhatja a SELECT ... INTO OUTFILE
-t is egy VALUES
utasítással az íráshoz. értékeket közvetlenül egy fájlba. Itt látható egy példa:
Táblázat aliast kell használnia; Az oszlopnevek szintén támogatottak, és opcionálisan csak a kívánt oszlopokból írhatnak értékeket. Használhatja a SELECT ... INTO OUTFILE
által támogatott exportálási lehetőségek bármelyikét vagy mindegyikét a kimenet fájlba formázásához.
Íme egy példa, amely vesszővel elválasztott értékek (CSV) formátumban állítja elő a fájlt, amelyet sok program használ:
Ha INTO DUMPFILE
a INTO OUTFILE
helyett a MySQL csak egy sort ír be a fájlba, oszlopok vagy sorok lezárása nélkül, és semmilyen menekülési folyamat végrehajtása nélkül. Ez hasznos egy BLOB
érték kiválasztásához és fájlba történő tárolásához.
Bármely fájl, amelyet INTO OUTFILE
vagy INTO DUMPFILE
annak az operációs rendszernek a tulajdonosa, akinek a fiókja alatt a mysqld fut. (Soha ne futtassa a mysqld fájlt root
néven emiatt és egyéb okokból.) A MySQL 8.0.17 verziójától kezdve a fájl létrehozásának umaskja 0640; elegendő hozzáférési jogosultsággal kell rendelkeznie a fájl tartalmának kezeléséhez. A MySQL 8.0.17 előtt az umask 0666, és a fájlt a szerver gazdagépének minden felhasználója írhatja.
Ha a secure_file_priv
rendszerváltozó nem üres könyvtárnévre van állítva, akkor az írandó fájlnak abban a könyvtárban kell lennie.
Az Eseményütemező által végrehajtott események részeként előforduló SELECT ... INTO
utasítások összefüggésében diagnosztikai üzeneteket (nemcsak hibákat, hanem figyelmeztetéseket is) írnak a hibanaplóba , Windows rendszeren pedig az alkalmazás eseménynaplójába. További információkért lásd: 25.4.5. Szakasz, “Eseményütemező állapota”.
A MySQL 8.0.22 verziótól kezdve támogatást nyújt a SELECT INTO OUTFILE
és SELECT INTO DUMPFILE
, engedélyezve az adott verzióban bevezetett select_into_disk_sync
kiszolgáló rendszerváltozó beállításával. A kimeneti puffer mérete és opcionális késleltetése beállítása select_into_buffer_size
és select_into_disk_sync_delay
használatával. További információért tekintse meg ezen rendszerváltozók leírását.