You can store a value in a user-defined variable and then refer to it later.
This enables you to pass values from one statement to another. User-defined variables
are connection-specific. That is, a user variable defined by one client cannot be seen
or used by other clients. All variables for a given client connection are automatically
freed when that client exits.

SET @var_name = expr [, @var_name = expr] …

For SET, either = or := can be used as the assignment operator.

You can also assign a value to a user variable in statements other than SET. In this case,
the assignment operator must be := and not =

    because = is treated as a comparison operator

in non-SET statements:


mysql> select @a1;
+-------+
| @a1 |
+-------+
| test1 |
+-------+
1 row in set (0.00 sec)

mysql> SET @a2 := 'test2';
Query OK, 0 rows affected (0.00 sec)

mysql> select @a2;
+-------+
| @a2 |
+-------+
| test2 |
+-------+
1 row in set (0.00 sec)

mysql> SELECT @a3 := 'test3';
+----------------+
| @a3 := 'test3' |
+----------------+
| test3 |
+----------------+
1 row in set (0.00 sec)

mysql> select @a3;
+-------+
| @a3 |
+-------+
| test3 |
+-------+
1 row in set (0.00 sec)

mysql>

variables

User variables can be assigned a value from a limited set of data types:
integer, decimal, floating-point, binary or nonbinary string, or NULL value.

mysql> SET @t1=1, @t2=2, @t3:=4;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;
+------+------+------+--------------------+
| @t1 | @t2 | @t3 | @t4 := @t1+@t2+@t3 |
+------+------+------+--------------------+
| 1 | 2 | 4 | 7 |
+------+------+------+--------------------+
1 row in set (0.00 sec)

mysql>

variables2


mysql> SET @t1='test', @t2='-OK';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @t1, @t2:= concat(@t1,@t2);
+------+-----------------------+
| @t1 | @t2:= concat(@t1,@t2) |
+------+-----------------------+
| test | test-OK |
+------+-----------------------+
1 row in set (0.00 sec)

mysql>

variables3

※ ユーザーVariableは、大文字、小文字の区別はしないので以下のような結果になる。
variable_not_case_sensitive

参考サイト
8.4. User-Defined Variables
MySQL独自のENUM・SET型を使ってみよう


NULL, NOT NULL, DEFAULT, SET,ENUM,データ型などによる
Default値の変化について。


mysql> CREATE TABLE defaults (
-> id INT UNSIGNED NOT NULL UNIQUE,
-> col1 INT NULL,
-> col2 INT NOT NULL,
-> col3 INT DEFAULT 42,
-> col4 CHAR(5) NULL,
-> col5 CHAR(5) NOT NULL,
-> col6 CHAR(5) DEFAULT 'yoo',
-> col7 TEXT NULL,
-> col8 TEXT NOT NULL,
-> col9 TIME NOT NULL,
-> col10 DATE NULL,
-> col11 DATE NOT NULL,
-> col12 DATE DEFAULT '2002-02-08',
-> col13 ENUM('doo','yoo'),
-> col14 SET('blabla','yooyoo'),
-> col15 ENUM('doo','yoo') NOT NULL,
-> col16 SET('blabla','yooyoo') NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc defaults;
+-------+------------------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------------+------+-----+------------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| col1 | int(11) | YES | | NULL | |
| col2 | int(11) | NO | | NULL | |
| col3 | int(11) | YES | | 42 | |
| col4 | char(5) | YES | | NULL | |
| col5 | char(5) | NO | | NULL | |
| col6 | char(5) | YES | | yoo | |
| col7 | text | YES | | NULL | |
| col8 | text | NO | | NULL | |
| col9 | time | NO | | NULL | |
| col10 | date | YES | | NULL | |
| col11 | date | NO | | NULL | |
| col12 | date | YES | | 2002-02-08 | |
| col13 | enum('doo','yoo') | YES | | NULL | |
| col14 | set('blabla','yooyoo') | YES | | NULL | |
| col15 | enum('doo','yoo') | NO | | NULL | |
| col16 | set('blabla','yooyoo') | NO | | NULL | |
+-------+------------------------+------+-----+------------+-------+
17 rows in set (0.01 sec)

64

mysql> INSERT INTO defaults (id) VALUES (1);
Query OK, 1 row affected, 6 warnings (0.00 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1364 | Field 'col2' doesn't have a default value |
| Warning | 1364 | Field 'col5' doesn't have a default value |
| Warning | 1364 | Field 'col8' doesn't have a default value |
| Warning | 1364 | Field 'col9' doesn't have a default value |
| Warning | 1364 | Field 'col11' doesn't have a default value |
| Warning | 1364 | Field 'col16' doesn't have a default value |
+---------+------+--------------------------------------------+
6 rows in set (0.00 sec)

mysql> select * from defaults\G
*************************** 1. row ***************************
id: 1
col1: NULL
col2: 0
col3: 42
col4: NULL
col5:
col6: yoo
col7: NULL
col8:
col9: 00:00:00
col10: NULL
col11: 0000-00-00
col12: 2002-02-08
col13: NULL
col14: NULL
col15: doo
col16:
1 row in set (0.00 sec)

mysql>

※データ型やNULL値を許容するかしないかにより値が変わる。
※TEXT型にはDefault値が利用出来ない。
※その他

def64

6.2.3.3. ENUM 型

ENUM 型は、テーブルの作成時にカラムの仕様で明示的に列挙された使用可能な
値のリストから、通常、値が選択される文字列オブジェクトです。

* 不正な値(使用可能な値のリストに含まれない文字列)を ENUM 型のカラムに挿入すると、
特殊なエラー値として、空の文字列が挿入される。この文字列は数値 0 を持つため、’通常’ の空の
文字列とは区別することができる(これについては後述)。

* ENUM 型が NULL として宣言されている場合、そのカラムでは NULL も正しい値となり、
デフォルト値は NULL になる。ENUM 型が NOT NULL として宣言されている場合は、
使用可能な値の最初の要素がデフォルト値として使用される。


メモリーテーブルは高速で便利ですが、サイズの制限をしておかないとメモリーを使いすぎて
しまうので、「set global max_heap_table_size = xxxxxx」でメモリーの上限を設定しておく。
反対に作成しようとしているテーブルが大きい場合は大きめに設定しておく。

mysql> select @@global.max_heap_table_size;
+------------------------------+
| @@global.max_heap_table_size |
+------------------------------+
| 16777216 |
+------------------------------+
1 row in set (0.00 sec)

mysql> set GLOBAL max_heap_table_size = 1024 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> select @@global.max_heap_table_size;
+------------------------------+
| @@global.max_heap_table_size |
+------------------------------+
| 1048576 |
+------------------------------+
1 row in set (0.00 sec)

mysql>

max_heap

set globalでの変更は、DBの再起動で設定が消えてしまうので、オプションファイル(my.cnf)に書いておく。

メモ:
その他の動的変数はここ 4.2.4.2. 動的システム変数