13.2.10.1 SELECT .. . Instrukcja INTO
SELECT ... INTO
forma SELECT
włącza wynik zapytania do zapisania w zmiennych lub do pliku:
-
SELECT ... INTO
wybiera wartości kolumn i przechowuje je w zmiennych.var_list
-
SELECT ... INTO OUTFILE
zapisuje wybrane wiersze do pliku. Można określić terminatory kolumn i wierszy, aby wygenerować określony format wyjściowy. -
SELECT ... INTO DUMPFILE
zapisuje pojedynczy wiersz w pliku bez żadnego formatowania.
Dana instrukcja SELECT
może zawierać co najwyżej jedną klauzulę INTO
, chociaż jest to pokazane przez SELECT
opis składni (patrz Sekcja 13.2.10,„ Instrukcja SELECT ”), INTO
może pojawiać się w różnych pozycjach:
-
Przed
FROM
. Przykład: -
Przed końcową klauzulą blokującą. Przykład:
-
Na końcu
SELECT
. Przykład:
INTO
pozycja na końcu instrukcji jest obsługiwana od MySQL 8.0.20 i jest pozycją preferowaną. Pozycja przed klauzulą blokującą jest przestarzała od MySQL 8.0.20; spodziewaj się, że zostanie usunięta w af uture wersja MySQL. Innymi słowy, INTO
po FROM
, ale nie na końcu SELECT
, daje ostrzeżenie.
Klauzula INTO
nie powinna być używana w zagnieżdżonej SELECT
, ponieważ taka SELECT
musi zwrócić swój wynik do kontekstu zewnętrznego. Istnieją również ograniczenia dotyczące używania INTO
w instrukcjach UNION
; patrz sekcja 13.2.10.3, „Klauzula UNION”.
Dla wariantu INTO
: var_list
-
var_list
nazywa listę jednej lub więcej zmiennych, z których każda może być zmienną zdefiniowaną przez użytkownika, procedurą składowaną lub parametrem funkcji lub zapisana lokalna zmienna programu. (W przygotowanej instrukcjiSELECT ... INTO
dozwolone są tylko zmienne zdefiniowane przez użytkownika; zobacz Sekcja 13.6.4.2, „Zakres i rozdzielczość lokalnych zmiennych” .)var_list
-
Wybrane wartości są przypisane do zmiennych. Liczba zmiennych musi odpowiadać liczbie kolumn. Zapytanie powinno zwrócić pojedynczy wiersz. Jeśli zapytanie nie zwróci żadnych wierszy, pojawi się ostrzeżenie z kodem błędu 1329 (
No data
), a wartości zmiennych pozostają niezmienione. Jeśli zapytanie zwróci wiele wierszy, wystąpi błąd 1172 (Result consisted of more than one row
). Jeśli jest możliwe, że instrukcja może pobierać wiele wierszy, możesz użyćLIMIT 1
, aby ograniczyć zestaw wyników do jednego wiersza.
INTO
można również używany z instrukcją var_list
TABLE
, z zastrzeżeniem następujących ograniczeń:
-
Liczba zmienne muszą odpowiadać liczbie kolumn w tabeli.
-
Jeśli tabela zawiera więcej niż jeden wiersz, musisz użyć
LIMIT 1
, aby ograniczyć wynik do jednego wiersza.LIMIT 1
musi poprzedzać słowo kluczoweINTO
.
Przykład takiej instrukcji jest pokazana tutaj:
Możesz także wybrać wartości z instrukcji VALUES
, która generuje jeden wiersz do zestawu zmiennych użytkownika. W takim przypadku musisz zastosować alias tabeli i musisz przypisać każdą wartość z listy wartości do zmiennej. Każda z dwóch pokazanych tutaj instrukcji jest równoważna z SET @x=2, @y=4, @z=8
:
W nazwach zmiennych użytkownika nie jest rozróżniana wielkość liter . Zobacz Sekcja 9.4, „Zmienne definiowane przez użytkownika”.
SELECT ... INTO OUTFILE "
forma file_name
"SELECT
zapisuje wybrane wiersze do pliku. Plik jest tworzony na hoście serwera, więc musisz mieć uprawnienie FILE
, aby używać tej składni. file_name
nie może być istniejącym plikiem, co między innymi zapobiega modyfikowaniu plików takich jak /etc/passwd
i tabel bazy danych. Zmienna systemowa character_set_filesystem
steruje interpretacją nazwy pliku.
Instrukcja SELECT ... INTO OUTFILE
ma na celu umożliwienie zrzucenia tabeli do pliku tekstowego na hoście serwera.Aby utworzyć plik wynikowy na innym hoście, SELECT ... INTO OUTFILE
zwykle nie jest odpowiednie, ponieważ nie ma możliwości zapisania ścieżki do pliku względem systemu plików hosta serwera, chyba że lokalizacja Dostęp do pliku na hoście zdalnym można uzyskać za pomocą ścieżki odwzorowanej w sieci w systemie plików hosta serwera.
Alternatywnie, jeśli oprogramowanie klienta MySQL jest zainstalowane na zdalnym hoście, możesz użyć polecenia klienta, takiego jak mysql -e "SELECT ..." >
, aby wygenerować plik na tym hoście. file_name
SELECT ... INTO OUTFILE
jest uzupełnieniem LOAD DATA
. Wartości kolumn są zapisywane i konwertowane na zestaw znaków określony w klauzuli CHARACTER SET
. Jeśli nie ma takiej klauzuli, wartości są zrzucane przy użyciu zestawu znaków binary
. W efekcie nie ma konwersji zestawu znaków. Jeśli zestaw wyników zawiera kolumny w kilku zestawach znaków, taki sam jest plik danych wyjściowych, a ponowne załadowanie pliku może być niemożliwe.
Składnia export_options
części instrukcji składa się z tych samych FIELDS
i LINES
, które są używane z instrukcją LOAD DATA
. Informacje na temat klauzul FIELDS
i LINES
, w tym ich wartości domyślnych i dopuszczalnych, można znaleźć w sekcji 13.2.7, „Instrukcja LOAD DATA” .
FIELDS ESCAPED BY
określa sposób wpisywania znaków specjalnych. Jeśli znak FIELDS ESCAPED BY
nie jest pusty, jest używany, gdy konieczne, aby uniknąć niejednoznaczności jako prefiks poprzedzający następujące znaki na wyjściu:
-
FIELDS ESCAPED BY
znak -
FIELDS ENCLOSED BY
znak -
Pierwszy znak
FIELDS TERMINATED BY
iLINES TERMINATED BY
wartości -
ASCII
NUL
(bajt o wartości zerowej; to, co faktycznie jest zapisywane po znaku zmiany znaczenia, to ASCII0
, a nie bajt o wartości zerowej)
FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
lub LINES TERMINATED BY
znaki muszą zostać zmienione, aby można było niezawodnie odczytać plik. ASCII NUL
jest chroniony kodem zmiany znaczenia, aby ułatwić przeglądanie na niektórych stronach.
Wynikowy plik nie musi być zgodny ze składnią SQL, więc nic więcej nie musi być chronione.
Jeśli znak FIELDS ESCAPED BY
jest pusty, żadne znaki nie są zmieniane, a NULL
jest wyprowadzane jako NULL
, a nie \N
. Prawdopodobnie nie jest dobrym pomysłem określanie pustego znaku zmiany znaczenia, szczególnie jeśli wartości pól w danych zawierają którykolwiek ze znaków z właśnie podanej listy.
INTO OUTFILE
może być również używany z instrukcją TABLE
, gdy chcesz zrzucić wszystkie kolumny tabeli do plik tekstowy. W tym przypadku kolejność i liczbę wierszy można kontrolować za pomocą ORDER BY
i LIMIT
; te klauzule muszą poprzedzać INTO OUTFILE
. TABLE ... INTO OUTFILE
obsługuje te same export_options
co SELECT ... INTO OUTFILE
i podlega tym samym ograniczeniom przy zapisie do systemu plików. Oto przykład takiej instrukcji:
Możesz również użyć SELECT ... INTO OUTFILE
z instrukcją VALUES
, aby napisać wartości bezpośrednio do pliku. Oto przykład:
Musisz użyć aliasu tabeli; aliasy kolumn są również obsługiwane i mogą być opcjonalnie używane do zapisywania wartości tylko z żądanych kolumn. Możesz także użyć dowolnej lub wszystkich opcji eksportu obsługiwanych przez SELECT ... INTO OUTFILE
, aby sformatować dane wyjściowe do pliku.
Oto przykład, który tworzy plik w formacie wartości rozdzielanych przecinkami (CSV) używanym przez wiele programów:
Jeśli używasz INTO DUMPFILE
zamiast INTO OUTFILE
, MySQL zapisuje tylko jeden wiersz do pliku, bez żadnej kolumny lub zakończenia wiersza oraz bez wykonywania przetwarzania zmiany znaczenia. Jest to przydatne przy wybieraniu wartości BLOB
i zapisywaniu jej w pliku.
Dowolny plik utworzony przez INTO OUTFILE
lub INTO DUMPFILE
należy do użytkownika systemu operacyjnego, na którego koncie działa mysqld. (Nigdy nie powinieneś uruchamiać mysqld jako root
z tego i innych powodów). Od MySQL 8.0.17 umask do tworzenia plików to 0640; musisz mieć wystarczające uprawnienia dostępu, aby manipulować zawartością pliku. Przed MySQL 8.0.17, umask to 0666, a plik jest zapisywalny dla wszystkich użytkowników na hoście serwera.
Jeśli zmienna systemowa secure_file_priv
jest ustawiona na niepustą nazwę katalogu, zapisywany plik musi znajdować się w tym katalogu.
W kontekście instrukcji SELECT ... INTO
, które występują jako część zdarzeń wykonywanych przez Harmonogram zdarzeń, komunikaty diagnostyczne (nie tylko błędy, ale także ostrzeżenia) są zapisywane w dzienniku błędów , aw systemie Windows do dziennika zdarzeń aplikacji. Aby uzyskać dodatkowe informacje, zobacz Sekcja 25.4.5, „Stan harmonogramu zdarzeń”.
Od MySQL 8.0.22 dostępna jest obsługa okresowej synchronizacji plików wyjściowych zapisywanych przez SELECT INTO OUTFILE
i SELECT INTO DUMPFILE
, włączane przez ustawienie zmiennej systemowej serwera select_into_disk_sync
wprowadzonej w tej wersji. Rozmiar bufora wyjściowego i opcjonalne opóźnienie można ustawić za pomocą odpowiednio select_into_buffer_size
i select_into_disk_sync_delay
. Aby uzyskać więcej informacji, zobacz opisy tych zmiennych systemowych.