Możesz uzyskać dostęp do dowolnej zmiennej zdefiniowanej przez użytkownika bez jej deklarowania lub inicjowania. Jeśli odwołujesz się do zmiennej, która nie została zainicjowana, ma ona wartość NULLi typ ciągu.
SELECT@var_any_var_name
Możesz zainicjować zmienną za pomocą SETlub SELECTinstrukcji:
SET@start=1,@finish =10;
lub
SELECT@start:=1,@finish :=10;SELECT*FROM places WHERE place BETWEEN@startAND@finish;
Zmiennym użytkownika można przypisać wartość z ograniczonego zestawu typów danych: liczba całkowita, dziesiętna, zmiennoprzecinkowa, ciąg binarny lub niebinarny lub wartość NULL.
Zmienne zdefiniowane przez użytkownika są specyficzne dla sesji. Oznacza to, że zmienna użytkownika zdefiniowana przez jednego klienta nie może być widoczna ani używana przez innych klientów.
Serwer MySQL utrzymuje wiele zmiennych systemowych skonfigurowanych na wartość domyślną. Mogą być typu GLOBAL, SESSIONlub BOTH.
Zmienne globalne wpływają na ogólne działanie serwera, podczas gdy zmienne sesyjne wpływają na jego działanie dla indywidualnych połączeń klientów.
Aby zobaczyć bieżące wartości używane przez działający serwer, użyj SHOW VARIABLESinstrukcji lub SELECT @@var_name.
SHOW VARIABLES LIKE'%wait_timeout%';SELECT@@sort_buffer_size;
Można je ustawić przy uruchamianiu serwera za pomocą opcji w wierszu polecenia lub w pliku opcji. Większość z nich można zmieniać dynamicznie podczas działania serwera za pomocą SET GLOBALlub SET SESSION:
-- Syntax to Set value to a Global variable:SET GLOBAL sort_buffer_size=1000000;SET@@global.sort_buffer_size=1000000;-- Syntax to Set value to a Session variable:SET sort_buffer_size=1000000;SET SESSION sort_buffer_size=1000000;SET@@sort_buffer_size=1000000;SET@@local.sort_buffer_size=10000;
Jakoś =operator nie działał dla mnie. Działało dobrze, gdy korzystałem z :=operatora.
divinedragon,
24
=operator działa tylko w SETklauzuli. Do przypisania wartości zmiennej w SELECTzapytaniu można użyć :=operatora np.SELECT @start := 1
Omesh
2
Czy możesz wyjaśnić, co to znaczy: „Nie trzeba deklarować zmiennych sesji zdefiniowanych przez użytkownika przedrostkiem @”?
billynoah,
3
@billynoah Zakładam, że oznacza to, że zmienne sesji zdefiniowane przez użytkownika (które zaczynają się od @) nie wymagają wyraźnej deklaracji; możesz przypisać je natychmiast, tak jakby już zostały zadeklarowane.
jobo3208
2
I możesz przypisać zmienną z wynikiem instrukcji select w następujący sposób: SET @subscriptionId = (wybierz identyfikator subskrypcji od użytkownika, gdzie emailAddress='[email protected] ');
Software Prorocy
28
ZESTAW
SET@var_name = value
LUB
SET@var := value
oba operatory = i : = są akceptowane
WYBIERZ
SELECT col1,@var_name := col2 from tb_name WHERE"conditon";
jeśli znaleziono wiele zestawów rekordów, zachowana jest tylko ostatnia wartość w kolumnie 2 (przesłonięcie);
SELECT col1, col2 INTO@var_name, col3 FROM.....
w tym przypadku wynik wyboru nie zawiera wartości col2
Z obu zastosowanych metod
- TRIGGER_BEFORE_INSERT --- ustawienie wartości kolumny na podstawie obliczeń
...SELECT count(*)INTO@NR FROM a_table WHERE a_condition;SET NEW.ord_col = IFNULL(@NR,0)+1;...
Myślę, że dla mysql składnia SELECT jest konieczna do oddzielenia znaczenia = (porównanie) od: = (asign)
bortunac
1
W niektórych przypadkach wartości pozostawione w zmiennych NIE mogą odpowiadać ostatniemu zwracanemu wierszowi. Na przykład SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10wydaje się oceniać przypisania zmiennych przed zakończeniem sortowania, aby zwracana wartość @var mogła nawet nie odnosić się do żadnego ze zwracanych wierszy. Jednak doktorzy nie mówią, w jakich warunkach może się to zdarzyć.
zmienne lokalne (które nie są poprzedzone @) są silnie typowane i obejmują zakres przechowywanego bloku programu, w którym zostały zadeklarowane. Zauważ, że zgodnie z dokumentacją w DECLARE Składnia :
DECLARE jest dozwolone tylko wewnątrz instrukcji złożonej BEGIN ... END i musi być na początku, przed innymi instrukcjami.
Zmienne użytkownika (które są poprzedzone przez @) są luźno wpisane i mają zakres do sesji. Pamiętaj, że nie potrzebują ani nie mogą być zadeklarowane - po prostu użyj ich bezpośrednio.
Dlatego, jeśli definiujesz zapisany program i naprawdę chcesz mieć „zmienną lokalną”, musisz usunąć znak @ i upewnić się, że instrukcja DECLARE znajduje się na początku bloku programu. W przeciwnym razie, aby użyć „zmiennej użytkownika”, upuść instrukcję DECLARE.
Ponadto musisz albo otoczyć zapytanie w nawiasach, aby wykonać je jako podzapytanie:
Dla każdej osoby używającej @variable w funkcji concat_ws w celu uzyskania połączonych wartości, nie zapomnij ponownie zainicjować jej z pustą wartością. W przeciwnym razie może użyć starej wartości dla tej samej sesji.
Odpowiedzi:
Istnieją głównie trzy typy zmiennych w MySQL:
Zmienne zdefiniowane przez użytkownika (z prefiksem
@
):Możesz uzyskać dostęp do dowolnej zmiennej zdefiniowanej przez użytkownika bez jej deklarowania lub inicjowania. Jeśli odwołujesz się do zmiennej, która nie została zainicjowana, ma ona wartość
NULL
i typ ciągu.Możesz zainicjować zmienną za pomocą
SET
lubSELECT
instrukcji:lub
Zmiennym użytkownika można przypisać wartość z ograniczonego zestawu typów danych: liczba całkowita, dziesiętna, zmiennoprzecinkowa, ciąg binarny lub niebinarny lub wartość NULL.
Zmienne zdefiniowane przez użytkownika są specyficzne dla sesji. Oznacza to, że zmienna użytkownika zdefiniowana przez jednego klienta nie może być widoczna ani używana przez innych klientów.
Można ich używać w
SELECT
zapytaniach wykorzystujących zaawansowane techniki zmiennych użytkownika MySQL .Zmienne lokalne (bez prefiksu):
Zmienne lokalne należy zadeklarować za pomocą
DECLARE
przed uzyskaniem dostępu do nich.Mogą być używane jako zmienne lokalne i parametry wejściowe wewnątrz procedury składowanej:
Jeśli
DEFAULT
brakuje klauzuli, wartością początkową jestNULL
.Zakres zmiennej lokalnej to
BEGIN ... END
blok, w którym jest deklarowany.Zmienne systemowe serwera (z prefiksem
@@
):Serwer MySQL utrzymuje wiele zmiennych systemowych skonfigurowanych na wartość domyślną. Mogą być typu
GLOBAL
,SESSION
lubBOTH
.Zmienne globalne wpływają na ogólne działanie serwera, podczas gdy zmienne sesyjne wpływają na jego działanie dla indywidualnych połączeń klientów.
Aby zobaczyć bieżące wartości używane przez działający serwer, użyj
SHOW VARIABLES
instrukcji lubSELECT @@var_name
.Można je ustawić przy uruchamianiu serwera za pomocą opcji w wierszu polecenia lub w pliku opcji. Większość z nich można zmieniać dynamicznie podczas działania serwera za pomocą
SET GLOBAL
lubSET SESSION
:źródło
=
operator nie działał dla mnie. Działało dobrze, gdy korzystałem z:=
operatora.=
operator działa tylko wSET
klauzuli. Do przypisania wartości zmiennej wSELECT
zapytaniu można użyć:=
operatora np.SELECT @start := 1
LUB
oba operatory = i : = są akceptowane
jeśli znaleziono wiele zestawów rekordów, zachowana jest tylko ostatnia wartość w kolumnie 2 (przesłonięcie);
w tym przypadku wynik wyboru nie zawiera wartości col2
Z obu zastosowanych metod
- TRIGGER_BEFORE_INSERT --- ustawienie wartości kolumny na podstawie obliczeń
źródło
=
i:=
?SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
wydaje się oceniać przypisania zmiennych przed zakończeniem sortowania, aby zwracana wartość @var mogła nawet nie odnosić się do żadnego ze zwracanych wierszy. Jednak doktorzy nie mówią, w jakich warunkach może się to zdarzyć.Użyj ustaw lub wybierz
przykład:
źródło
Różne typy zmiennych:
DECLARE jest dozwolone tylko wewnątrz instrukcji złożonej BEGIN ... END i musi być na początku, przed innymi instrukcjami.
Dlatego, jeśli definiujesz zapisany program i naprawdę chcesz mieć „zmienną lokalną”, musisz usunąć znak @ i upewnić się, że instrukcja DECLARE znajduje się na początku bloku programu. W przeciwnym razie, aby użyć „zmiennej użytkownika”, upuść instrukcję DECLARE.
Ponadto musisz albo otoczyć zapytanie w nawiasach, aby wykonać je jako podzapytanie:
Albo możesz użyć SELECT ... INTO:
źródło
Dla każdej osoby używającej @variable w funkcji concat_ws w celu uzyskania połączonych wartości, nie zapomnij ponownie zainicjować jej z pustą wartością. W przeciwnym razie może użyć starej wartości dla tej samej sesji.
źródło
Ogłosić:
SET @a = 1;
Stosowanie:
INSERT INTO `t` (`c`) VALUES (@a);
źródło
Ustalić wartość
źródło