名前 | 説明 |
---|---|
DEFAULT() |
テーブルカラムのデフォルト値を返します |
GET_LOCK() |
指定されたロックを取得します |
INET_ATON() |
数値で IP アドレスを返します |
INET_NTOA() |
数値に対応する IP アドレスを返します |
IS_FREE_LOCK() |
指定されたロックが未使用かどうかを確認します |
IS_USED_LOCK() (v4.1.0) |
指定されたロックが使用中かどうかを確認しますtrue の場合は接続識別子を返します。 |
MASTER_POS_WAIT() |
スレーブが指定された位置までのすべての更新の読み取りと適用を完了するまで、ブロックします |
NAME_CONST() (v5.0.12) |
カラムが指定された名前を持つようにします |
RAND() |
ランダムな浮動小数点値を返します |
RELEASE_LOCK() |
指定されたロックを解放します |
SLEEP() (v5.0.12) |
ある秒数だけスリープします |
UUID_SHORT() (v5.1.20) |
整数値の汎用識別子を返します |
UUID() (v4.1.2) |
汎用一意識別子 (UUID) を返します |
VALUES() (v4.1.1) |
INSERT 中に使用される値を定義します |
テーブルカラムにデフォルト値を返します。カラムがデフォルト値を持たない場合はエラーが発生します。
mysql> UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100;
FORMAT(
X
,D
)
数値 X
を「'#,###,###.##
」のような形式にフォーマットして小数第
D
位までに丸め、その結果を文字列として返します。詳細については、項7.4. 「文字列関数」をご参照ください。
timeout
秒の待機時間を使用して、文字列
str
によって与えられた名前でロックの獲得を試みます。ロックの獲得が成功した場合は
1
を返し、試行が時間切れになった場合
(たとえば、ほかのクライアントがすでにその名前をロックしている場合)
は 0
を、または、エラーが発生
(メモリーの不足、または
mysqladmin kill
によるスレッドの停止) した場合は
NULL
を返します。GET_LOCK()
でロックを獲得した場合、RELEASE_LOCK()
を実行したとき、新しい
GET_LOCK()
を実行したとき、または接続が切断されたとき
(正常または異常な終了を問わず)
にリリースされます。GET_LOCK()
でロックを獲得した場合は、トランザクションと対話しないようにしてください。これは、トランザクションをコミットしても、トランザクション中に獲得されたそれらのロックはリリースされないためです。
この関数は、アプリケーションロックの実装、またはレコードロックのシミュレートに使用することができます。名前はサーバー全体に渡ってロックされます。ひとつのクライアントが名前をロックすると、GET_LOCK()
がほかのクライアントからの同じ名前の使用要求をブロックします。これによって、与えられたロック名を承認したクライアントが、名前を使用して協調任意型のロックを行うことができます。ただし同時に、協調するクライアントのセットにないクライアントも、過失にせよ故意にせよ、名前をロックすることができることになり、協調するクライアントがその名前を使用できなくなりますので注意してください。それを防ぐひとつの方法は、データベース固有、またはアプリケーション固有のロック名を使用することです。フォーム
db_name.str
または
app_name.str
のロック名を使用するのもその一例です。
mysql>SELECT GET_LOCK('lock1',10);
-> 1 mysql>SELECT IS_FREE_LOCK('lock2');
-> 1 mysql>SELECT GET_LOCK('lock2',10);
-> 1 mysql>SELECT RELEASE_LOCK('lock2');
-> 1 mysql>SELECT RELEASE_LOCK('lock1');
-> NULL
2 番目の
RELEASE_LOCK()
呼び出しは、ロック
'lock1'
が 2 番目の
GET_LOCK()
呼び出しによって自動的にリリースされるため、NULL
を返します。
複数のクライアントがロック待ちの状態にある場合、ロックの取得順序は未定義となり、使用中のスレッドライブラリなどの要因に左右されます。特にアプリケーションは、クライアントがロック要求を発行した順番でロックを取得すると仮定すべきではありません。
クライアントが、ほかのクライアントによってすでに確保されたロックの獲得を試みると、timeout
引数によってそのクライアントはブロックされます。ブロックされたクライアントが停止する場合、そのスレッドはロックがタイムアウトを要求するまで停止しません。これは既知のバグです
(MySQL 6.0 で修正)。
ネットワークアドレスのドット形式のクワッド表示が文字列として与えられ、アドレスの数値を示す整数を返します。アドレスは 4 または 8 バイトのアドレスである可能性があります。
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480
生成される数字は常にネットワークバイト順になります。たとえばこの例のように、数字は 209×2563 + 207×2562 + 224×256 + 40 として計算されます。
また
INET_ATON()
は、短縮形式の IP アドレスを理解します :
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
->
2130706433, 2130706433
INET_ATON()
によって生成された値を格納する場合は、INT
UNSIGNED
カラムの使用を推奨します。(符号付の)
INT
カラムを使用すると、最初のオクテットが
127 以上である IP
アドレスに対応する値は正しく保存されません。項6.2. 「数値型」
を参照してください。
ネットワークバイト順序の数値ネットワークアドレス (4 または 8 バイト) を与えられ、アドレスのドット形式のクワッド表示を文字列として返します。
mysql> SELECT INET_NTOA(3520061480);
-> '209.207.224.40'
str
と名付けられたロックが使用可能か
(ロックされていないか)
調べます。ロックが使用可能
(まだ使用されていない) 場合は
1
を、すでに使用されている場合は
0
を返し、エラーが発生した場合
(引数が不正確、など) は
NULL
を返します。
str
と名付けられたロックが使用されているか
(ロックされているか)
調べます。ロックされている場合は、ロックを持っているクライアントの接続識別子を返します。ロックされていないときは
NULL
を返します。
MASTER_POS_WAIT(
log_name
,log_pos
[,timeout
])
この関数は、マスター /
スレーブの同期化のコントロールに役立ちます。スレーブがマスターログで指定された位置まで読み取り、すべてのアップデートを適用するまでブロックします。戻り値は、指定の位置まで進むまでスレーブが待たなければいけないログイベントの数です。この関数は、スレーブ
SQL
スレッドが開始されていない、スレーブのマスター情報が初期化されていない、引数が正しくない、またはエラーが発生、という場合は
NULL
を返します。タイムアウトの時間を越えると
-1
が戻されます。MASTER_POS_WAIT()
の待機中にスレーブ SQL
スレッドが停止すると、関数は
NULL
を返します。スレーブが指定の位置を過ぎたら、関数はただちに返しを行います。
timeout
値が指定された場合、MASTER_POS_WAIT()
は、timeout
の秒数だけ経過した時点で待機を中止します。timeout
は 0
より大きくなければなりません。timeout
がゼロまたは負の場合、それはタイムアウトが発生しないことを意味します。
与えられた値を返します。結果セットのカラムの生成に使用された場合、NAME_CONST()
が、カラムが与えられた名前を持つ原因になります。引数は定数にすべきです。
mysql> SELECT NAME_CONST('myname', 14);
+--------+ | myname | +--------+
| 14 | +--------+
この関数は MySQL 5.0.12 から、内部使用のみの目的で追加されました。Binary Logging of Stored Programs で説明されているように、プログラム局所変数への参照を含むストアドプログラムからのステートメントを書くときにサーバーが使用します。mysqlbinlog からの出力にこの関数が含まれる場合があります。
GET_LOCK()
で獲得された文字列 str
によって名付けられたロックをリリースします。ロックがリリースされた場合は
1
を、ロックがこのスレッドによって確立されていない場合
(その場合ロックはリリースされません) は
0
を、そして、名前付きのロックが存在しない場合は
NULL
を返します。GET_LOCK()
への呼び出しで獲得、またはすでにリリースされていないかぎり、ロックは存在しません。
DO
ステートメントは
RELEASE_LOCK()
との使用に便利です。項8.2.3. 「DO
構文」
を参照してください。
duration
引数に指定された秒数だけスリープ
(一時停止) したあと、0
を返します。SLEEP()
で割り込みが発生した場合は 1
が返されます。この期間には、マイクロ秒を表す小数部分が含まれていてもかまいません。
1977 年 10 月に、The Open Group が発行した 「DCE 1.1:Remote Procedure Call」 (Appendix A) CAE (Common Applications Environment) Specifications (Document Number C706、http://www.opengroup.org/public/pubs/catalog/c706.htm) に基づいて生成された Universal Unique Identifier (UUID) を返します。
UUID
は、スペースおよび時間においてグローバルに一意の数字としてデザインされています。UUID()
へのふたつの呼び出しは、互いに接続されていない別々のコンピュータ上で行った場合でも、それぞれ異なるふたつの値を生成することが想定されます。
UUID は、5 つの 16 進数から成る
utf8
文字列として表現された 128
ビットの数値であり、aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
という形式を持ちます。
最初の 3 桁はタイムスタンプから生成されます。
4 番目の数字は、タイムスタンプ値が単調整を失う場合 (たとえば、夏時間の影響などで) に備えて、一時的な一意性を保ちます。
5 番目の数字は、スペースの一意性を提供する IEEE 802 ノード番号です。後者が利用できない場合 (たとえば、ホストコンピュータが Ethernet カードを持たない、または使用のオペレーションシステムでインタフェースのハードウェアアドレスを見つける方法が分からない、など) 、ランダムな数字で代替されます。その場合、スペースの一意性は保証されません。しかしそれでも、不調和が起こる可能性は 非常に 低いと思われます。
現在、インタフェースの MAC アドレスは、FreeBSD と Linux でのみ考慮されています。ほかのオペレーションシステムでは、MySQL はランダムに生成された 48 ビットの数字を使用します。
mysql> SELECT UUID();
-> '6ccd780c-baba-1026-9564-0040f4311e29'
UUID()
関数は、character_set_server
パラメータで定義されるキャラクタセットに基づいて文字列を返します。UUID
値がテーブル内で使用され、格納先のカラムにインデックスが設定されている場合、そのカラムやテーブルのキャラクタセットは、UUID()
の呼び出し時に使用されたキャラクタセットに一致すべきです。カラムと
UUID
値とで同じキャラクタセットを使用しなかった場合には、それらのカラム上のインデックスは使用されず、テーブル内での値の検索が順次処理となるため、処理中にパフォーマンスの低下やテーブルのロックが発生する可能性があります。
UUID
ベースの文字列の使用時に異なるキャラクタセット間での変換を行うには、CONVERT()
関数を使用します。
UUID()
は、ステートメントベースのレプリケーションでは正しく動作しません。
(UUID()
関数で返されるような文字列形式の 128
ビット識別子ではなく)、「短い」
汎用識別子を 64
ビット符号なし整数として返します。
次の条件が成り立つ場合、UUID_SHORT()
の値が一意であることが保証されます。
一連のマスター/スレーブサーバーの中で現在のホストの
server_id
が一意である
server_id
の範囲が 0 ~ 255 である
mysqld の再起動時にサーバーのシステム時間をリセットしない
mysqld
の再起動までの
UUID_SHORT()
の呼び出し回数が、1 秒あたり平均 1600
万回を上回らない
UUID_SHORT()
の戻り値の生成方法は、次のとおりです。
(server_id & 255) << 56 + (server_startup_time_in_seconds << 24) + incremented_variable++;
mysql> SELECT UUID_SHORT();
-> 92395783831158784
UUID_SHORT()
は、ステートメントベースのレプリケーションでは正しく動作しません。
この機能は MySQL 5.1.20 に追加されました。
INSERT
... ON DUPLICATE KEY UPDATE
ステートメントでは、UPDATE
節の
VALUES(
関数を使用して、ステートメントの
col_name
)INSERT
部分からのカラム値を参照することができます。つまり、UPDATE
節内の
VALUES(
は、重複キーとの衝突もなく、インサートされる
col_name
)col_name
値を参照するということです。この関数は複数行のインサートにおいて特に便利です。VALUES()
は、INSERT
... ON DUPLICATE KEY UPDATE
ステートメントの中でだけ意味を持ち、そうでなければ
NULL
を返します。項8.2.5.3. 「INSERT
... ON DUPLICATE KEY UPDATE
構文」.
mysql>INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);