MySQL/Variables utilisateurs
Variables locales
[modifier | modifier le wikicode]Les types des variables MySQL sont forcément scalaires[1]. Pour une "variable tableau", il faut donc créer une table temporaire ou concaténer chaque ligne.
Les variables locales ne peuvent pas être lues en dehors de leur fonction ou procédure stockée[2].
Elles sont déclarées après DECLARE
avec leur nom, leur type, et éventuellement leur valeur par défaut[3] :
DECLARE MaVariable1 INT DEFAULT 1;
Variables de session
[modifier | modifier le wikicode]Les variables obéissent à certaines règles :
- Leurs noms commencent par "@" (ex :
@total
). - Elles sont déclarées avec le mot
SET
, ou bienSELECT
accompagné de l'opérateur d'assignation:=
. - Une variable définie dans la liste de champ ne peut pas être utilisée comme une condition.
- Les variables de session durent le temps du thread.
select @test := 2;
select @test + 1; -- renvoie 3
set @datedebut='date_de_debut', @datefin='date_de_fin';
SELECT @nbmembre:=count(*) FROM membres;
select @numzero := count(*) from table1 where field=0;
select @numdistint := count(distinct field) from table1 where field <> 0 ;
select @numzero @numdistinct;
Pour copier dans valeurs d'une sélection dans une ou plusieurs variables :
SET @id = 0, @nom = '';
SELECT id, nom INTO @id, @nom FROM table1 LIMIT 1;
SELECT @id, @nom;
Elles peuvent être utiles quand on doit agréger plusieurs valeurs sans jointures entre leurs tables. Ex :
SET @idCountry = (SELECT `id` FROM `country` WHERE `code` = "FR" LIMIT 1);
SET @idLanguage = (SELECT `id` FROM `language` WHERE `code` = "fr" LIMIT 1);
INSERT INTO `page` (`country`, `language`, `description`)
VALUES (@idCountry, @idLanguage, 'Text')
Variables globales
[modifier | modifier le wikicode]Une variable globale est visible pour tous les utilisateurs, elle est précédée de "@@".
Elles peuvent modifier les fichiers de configuration définitivement pendant la session. Donc en les changeant, il est nécessaire de préciser le critère définitif ou éphémère, en distinguant set global et set session.
Exemple :
mysql> set @@global.max_connections = 1000; mysql> show global variables like 'wait_timeout'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout | 60 | +---------------+-------+ 1 row in set (0.00 sec) mysql> set @@session.wait_timeout=120;
sql_mode
[modifier | modifier le wikicode]Un script peut avoir un comportant différent sur deux bases tournant sur la même version de MySQL. Par exemple il est possible d'imposer de préciser dans le GROUP BY
toutes les variables sélectionnées à regrouper avec ONLY_FULL_GROUP_BY
.
Ce paramétrage est visible avec sql_mode[4] :
SELECT @@sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Pour le modifier au démarrage dans Docker compose :
command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION