MySQL :: Podręcznik MySQL 8.0 :: 13.2.10.1 Instrukcja SELECT … INTO

13.2.10.1 SELECT .. . Instrukcja INTO

SELECT ... INTO forma SELECT włącza wynik zapytania do zapisania w zmiennych lub do pliku:

  • SELECT ... INTO var_list wybiera wartości kolumn i przechowuje je w zmiennych.

  • 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 instrukcji SELECT ... INTO var_list dozwolone są tylko zmienne zdefiniowane przez użytkownika; zobacz Sekcja 13.6.4.2, „Zakres i rozdzielczość lokalnych zmiennych” .)

  • 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 var_list można również używany z instrukcją 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 kluczowe INTO.

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 "file_name " forma 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 ..." > file_name , aby wygenerować plik na tym hoście.

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 i LINES TERMINATED BY wartości

  • ASCII NUL (bajt o wartości zerowej; to, co faktycznie jest zapisywane po znaku zmiany znaczenia, to ASCII 0, 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.

Uwaga

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.

Write a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *