表 12.20 「情報関数」
名前 | 説明 |
---|---|
BENCHMARK() |
式を繰り返し実行します |
CHARSET() |
引数の文字セットを返します |
COERCIBILITY() |
文字列引数の照合順序強制性値を返します |
COLLATION() |
文字列引数の照合順序を返します |
CONNECTION_ID() |
接続のための接続 ID (スレッド ID) を返します |
CURRENT_ROLE() |
現在アクティブなロールを返します |
CURRENT_USER() , CURRENT_USER |
認証済みユーザー名とホスト名 |
DATABASE() |
デフォルト (現在) のデータベース名を返します |
FOUND_ROWS() |
LIMIT 句付き SELECT で、LIMIT 句がない場合に戻される可能性がある行の数です |
ICU_VERSION() |
ICU ライブラリバージョン |
LAST_INSERT_ID() |
前回の INSERT での AUTOINCREMENT カラムの値です |
ROLES_GRAPHML() |
メモリーロールのサブグラフを表す GraphML ドキュメントを返します |
ROW_COUNT() |
更新された行数 |
SCHEMA() |
DATABASE() のシノニムです |
SESSION_USER() |
USER() のシノニムです |
SYSTEM_USER() |
USER() のシノニムです |
USER() |
ユーザー名と、クライアントによって提供されるホスト名です |
VERSION() |
MySQL サーバーのバージョンを示す文字列を返します |
-
BENCHMARK(
count
,expr
)BENCHMARK()
関数は、式expr
をcount
の回数だけ繰り返し実行します。 MySQL による式の処理速度を計測する際に使用される場合もあります。NULL
や負の繰返し回数などの不適切な引数の場合、結果値は0
またはNULL
です。この使用目的は、mysql クライアント内から、クエリーの実行時間をレポートすることです。
mysql> SELECT BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')); +---------------------------------------------------+ | BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')) | +---------------------------------------------------+ | 0 | +---------------------------------------------------+ 1 row in set (4.74 sec)
レポートされる時間は、クライアント側での経過時間であり、サーバー側での CPU 時間ではありません。
BENCHMARK()
を複数回実行し、サーバーマシン上の負荷量について結果を解釈することをお勧めします。BENCHMARK()
の目的は、スカラー式の実行時パフォーマンスを測定することです。これにより、その使用方法や結果の解釈方法について、重要ないくつかの推測が提供されます。スカラー式しか使用できません。 式をサブクエリーにすることはできますが、単一のカラムおよび最大でも単一の行が返される必要があります。 たとえば、テーブル
t
に複数のカラムまたは複数の行がある場合、BENCHMARK(10, (SELECT * FROM t))
は失敗します。SELECT
ステートメントをexpr
N
回実行する場合と、SELECT BENCHMARK(
を実行する場合とでは、発生するオーバーヘッドの量が異なります。 この 2 つは非常に異なる実行プロファイルを持つため、両者の所要時間は同一になりません。 前者では、パーサー、オプティマイザ、テーブルロック、および実行時評価がそれぞれN
,expr
)N
回ずつ発生します。 後者では、実行時評価のみがN
回発生し、その他のすべてのコンポーネントは 1 回だけ発生します。 割り当て済みのメモリー構造体は再使用され、集約関数で評価済みの結果をローカルキャッシュに入れるなどの実行時最適化によって、結果が変わる可能性もあります。 したがって、BENCHMARK()
を使用して、実行時コンポーネントに高い重みを付加し、ネットワーク、パーサー、オプティマイザなどで導入された「ノイズ」を削除することで、そのコンポーネントのパフォーマンスが測定されます。
-
CHARSET(
str
)文字列引数の文字セットを返します。
mysql> SELECT CHARSET('abc'); -> 'utf8' mysql> SELECT CHARSET(CONVERT('abc' USING latin1)); -> 'latin1' mysql> SELECT CHARSET(USER()); -> 'utf8'
-
COERCIBILITY(
str
)文字列引数の照合順序強制性値を返します。
mysql> SELECT COERCIBILITY('abc' COLLATE utf8_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(USER()); -> 3 mysql> SELECT COERCIBILITY('abc'); -> 4 mysql> SELECT COERCIBILITY(1000); -> 5
戻り値の意味は、次の表に示すとおりです。 値が低いほど、優先順位は高くなります。
型変換属性 意味 例 0
明示的な照合順序 COLLATE
句の値1
照合順序なし さまざまな照合順序との文字列の連結 2
暗黙的な照合順序 カラム値、ストアドルーチンパラメータ、またはローカル変数 3
系統定数 USER()
の戻り値4
型変換可能 リテラル文字列 5
数値 数値または時間値 5
無視可能 NULL
またはNULL
から派生した式詳細は、セクション10.8.4「式での照合の強制性」を参照してください。
-
COLLATION(
str
)文字列引数の照合順序を返します。
mysql> SELECT COLLATION('abc'); -> 'utf8_general_ci' mysql> SELECT COLLATION(_utf8mb4'abc'); -> 'utf8mb4_0900_ai_ci' mysql> SELECT COLLATION(_latin1'abc'); -> 'latin1_swedish_ci'
-
CONNECTION_ID()
接続用の接続 ID (スレッド ID) を返します。 すべての接続は、現在接続されているクライアントのセット間で一意の ID を持っています。
CONNECTION_ID()
で返される値の型は、INFORMATION_SCHEMA.PROCESSLIST
テーブルのID
カラム、SHOW PROCESSLIST
出力のId
カラム、およびパフォーマンススキーマthreads
テーブルのPROCESSLIST_ID
カラムに表示される値と同じです。mysql> SELECT CONNECTION_ID(); -> 23786
警告pseudo_thread_id
システム変数のセッション値を変更すると、CONNECTION_ID()
関数によって返される値が変更されます。 -
CURRENT_ROLE()
現在のセッションの現在アクティブなロールをカンマで区切って含む
utf8
文字列を返します。存在しない場合はNONE
を返します。 この値は、sql_quote_show_create
システム変数の設定を反映します。アカウントに次のようなロールが付与されているとします:
GRANT 'r1', 'r2' TO 'u1'@'localhost'; SET DEFAULT ROLE ALL TO 'u1'@'localhost';
u1
のセッションでは、CURRENT_ROLE()
の初期値によってデフォルトのアカウントロールが指定されます。 次のようなSET ROLE
の変更を使用:mysql> SELECT CURRENT_ROLE(); +-------------------+ | CURRENT_ROLE() | +-------------------+ | `r1`@`%`,`r2`@`%` | +-------------------+ mysql> SET ROLE 'r1'; SELECT CURRENT_ROLE(); +----------------+ | CURRENT_ROLE() | +----------------+ | `r1`@`%` | +----------------+
-
CURRENT_USER
,CURRENT_USER()
現在のクライアントを認証する際にサーバーで使用された MySQL アカウントを表すユーザー名とホスト名の組み合わせを返します。 このアカウントで、アクセス権限が決まります。 戻り値は、
utf8
文字セット内の文字列です。CURRENT_USER()
の値は、USER()
の値とは異なる可能性があります。mysql> SELECT USER(); -> 'davida@localhost' mysql> SELECT * FROM mysql.user; ERROR 1044: Access denied for user ''@'localhost' to database 'mysql' mysql> SELECT CURRENT_USER(); -> '@localhost'
この例は、クライアントが
davida
のユーザー名を指定 (USER()
関数の値で指定されます) したが、サーバーは匿名のユーザーアカウント (CURRENT_USER()
値の空のユーザー名部分に表示されます) を使用してクライアントを認証したことを示しています。 これが発生する原因として、davida
の付与テーブルにアカウントが一覧表示されていないことが考えられます。ストアドプログラムまたはビューでは、
SQL SECURITY INVOKER
特性で定義されていなければ、CURRENT_USER()
はオブジェクトを定義したユーザー (そのDEFINER
値で指定されます) のアカウントを返します。 後者の場合、CURRENT_USER()
はオブジェクトを呼び出したユーザーを返します。トリガーおよびイベントには、
SQL SECURITY
特性を定義するためのオプションがありません。したがって、このようなオブジェクトの場合、CURRENT_USER()
はオブジェクトを定義したユーザーのアカウントを返します。 呼び出したユーザーを返すには、USER()
またはSESSION_USER()
を使用します。次のステートメントでは、影響を受けるユーザーや定義したユーザーの名前 (ホストの可能性もあります) の代わりに、
CURRENT_USER()
関数を使用することがサポートされています。このような場合、必要に応じてCURRENT_USER()
が拡張されます。DROP USER
RENAME USER
GRANT
REVOKE
CREATE FUNCTION
CREATE PROCEDURE
CREATE TRIGGER
CREATE EVENT
CREATE VIEW
ALTER EVENT
ALTER VIEW
SET PASSWORD
CURRENT_USER()
のこの拡張によるレプリケーションへの影響については、セクション17.5.1.8「CURRENT_USER() のレプリケーション」 を参照してください。 -
DATABASE()
デフォルト (現在) のデータベース名を
utf8
文字セット内の文字列として返します。 デフォルトのデータベースがない場合は、DATABASE()
はNULL
を返します。 ストアドルーチン内では、デフォルトのデータベースはルーチンが関連付けられたデータベースですが、これは呼び出し元のコンテキストでのデフォルトのデータベースと同じであるとはかぎりません。mysql> SELECT DATABASE(); -> 'test'
デフォルトのデータベースがない場合は、
DATABASE()
はNULL
を返します。 -
FOUND_ROWS()
注記SQL_CALC_FOUND_ROWS
クエリー修飾子および付随するFOUND_ROWS()
関数は、MySQL 8.0.17 で非推奨になりました。これらは、MySQL の将来のバージョンで削除される予定です。 かわりに、LIMIT
を使用してクエリーを実行してから、追加の行があるかどうかを判断するためにCOUNT(*)
およびLIMIT
を使用しない別のクエリーを検討してください。 たとえば、次のクエリーのかわりに:SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; SELECT FOUND_ROWS();
かわりに次のクエリーを使用します:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10; SELECT COUNT(*) FROM tbl_name WHERE id > 100;
COUNT(*)
は、特定の最適化の対象となります。SQL_CALC_FOUND_ROWS
では、一部の最適化が無効になります。サーバーからクライアントに返される行の数を制限するために、
SELECT
ステートメントにLIMIT
句が含まれている場合があります。 場合によっては、ステートメントを再度実行せずに、LIMIT
を付けなかった場合にステートメントで返されるはずの行数を知っておくことが望ましいことがあります。 この行数を取得するには、SELECT
ステートメントにSQL_CALC_FOUND_ROWS
オプションを含めてから、FOUND_ROWS()
を起動します:mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();
2 番目の
SELECT
は、1 番目のSELECT
をLIMIT
句なしで記述した場合に返される行数を示す数字を返します。最近成功した
SELECT
ステートメントにSQL_CALC_FOUND_ROWS
オプションを付けなければ、FOUND_ROWS()
は、そのステートメントで返された結果セットの行数を返します。 ステートメントにLIMIT
句が含まれている場合、FOUND_ROWS()
はその制限値以下の行数を返します。 たとえば、ステートメントにLIMIT 10
またはLIMIT 50, 10
が含まれている場合、FOUND_ROWS()
はそれぞれ 10 と 60 を返します。FOUND_ROWS()
から取得できる行数は一時的なもので、SELECT SQL_CALC_FOUND_ROWS
ステートメントのあとに、このステートメントを発行しても取得できるようには設計されていません。 あとで値を参照する必要がある場合は、保存してください。mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ; mysql> SET @rows = FOUND_ROWS();
SELECT SQL_CALC_FOUND_ROWS
を使用している場合は、MySQL では完全な結果セット内の行数を計算する必要があります。 ただし、結果セットはクライアントに送信される必要がないため、LIMIT
なしでクエリーを再度実行するよりも速くなります。SQL_CALC_FOUND_ROWS
およびFOUND_ROWS()
は、クエリーで返される行数を制限するが、クエリーを再度実行しないで完全な結果セット内の行数を確認する必要がある状況でも役立ちます。 例として、検索結果のほかのセクションを表示するページへのリンクを含むページが表示される Web スクリプトがあります。FOUND_ROWS()
を使用すると、残りの結果を表示するために必要なその他のページ数を確認できます。SQL_CALC_FOUND_ROWS
およびFOUND_ROWS()
を使用すると、UNION
の複数箇所でLIMIT
が発生する可能性があるため、単純なSELECT
ステートメントよりも、UNION
ステートメントで使用した方が複雑になります。 これは、UNION
内の個々のSELECT
ステートメントに適用される場合と、UNION
の結果全体にグローバルに適用される場合があります。UNION
でSQL_CALC_FOUND_ROWS
を使用する目的は、グローバルなLIMIT
なしで返される行数を返すことです。UNION
でSQL_CALC_FOUND_ROWS
を使用する条件は、次のとおりです。UNION
の 1 番目のSELECT
に、SQL_CALC_FOUND_ROWS
キーワードが表示される必要があります。FOUND_ROWS()
の値は、UNION ALL
が使用されている場合にのみ正確です。ALL
なしでUNION
が使用される場合は、重複の削除が発生し、FOUND_ROWS()
の値が単なる近似値になります。UNION
でLIMIT
が表示されない場合は、SQL_CALC_FOUND_ROWS
が無視され、UNION
を処理するために作成された一時テーブル内の行数が返されます。
ここで説明した以外のケースでは、
FOUND_ROWS()
の動作 (エラーが発生してSELECT
ステートメントに失敗したあとの値など) が定義されません。重要ステートメントベースのレプリケーションでは、確実に
FOUND_ROWS()
をレプリケートすることはできません。 行ベースのレプリケーションを使用すると、この関数は自動的にレプリケートされます。 -
ICU_VERSION()
正規表現操作のサポートに使用される International Components for Unicode (ICU) ライブラリのバージョン (セクション12.8.2「正規表現」 を参照)。 この関数は、主にテストケースでの使用を目的としています。
-
LAST_INSERT_ID()
,LAST_INSERT_ID(
expr
)引数を指定しない場合、
LAST_INSERT_ID()
は、最後に実行されたINSERT
ステートメントの結果としてAUTO_INCREMENT
カラムに正常に挿入された最初の自動生成値を表すBIGINT UNSIGNED
(64-bit) 値を返します。 正常に挿入された行がない場合は、LAST_INSERT_ID()
の値は未変更のままです。引数を指定すると、
LAST_INSERT_ID()
は符号なし整数を戻します。たとえば、
AUTO_INCREMENT
値を生成する行を挿入したあとは、次のようにして値を取得できます。mysql> SELECT LAST_INSERT_ID(); -> 195
現在実行中のステートメントによって、
LAST_INSERT_ID()
の値は影響を受けません。 1 つのステートメントでAUTO_INCREMENT
値を生成してから、独自のAUTO_INCREMENT
カラムを含むテーブルに行を挿入する複数行のINSERT
ステートメントでLAST_INSERT_ID()
を参照すると仮定します。 2 番目のステートメントでは、LAST_INSERT_ID()
の値は安定したままです。2 番目以降の行の値は、前の行の挿入の影響を受けません。 (LAST_INSERT_ID()
とLAST_INSERT_ID(
への参照を混在させる場合、影響は定義されていないことに注意してください。)expr
)以前のステートメントでエラーが返された場合は、
LAST_INSERT_ID()
の値が定義されません。 トランザクションテーブルでは、エラーによってステートメントがロールバックされる場合、LAST_INSERT_ID()
の値は未定義のままです。 手動のROLLBACK
では、LAST_INSERT_ID()
の値はトランザクション前の値にリストアされず、ROLLBACK
時点と同じままです。ストアドルーチン (プロシージャーや関数) またはトリガーの本文内では、
LAST_INSERT_ID()
の値は、このような種類のオブジェクトの本文外で実行されたステートメントと同様に変更されます。 あとに続くステートメントで参照されるLAST_INSERT_ID()
の値でのストアドルーチンまたはトリガーの効果は、ルーチンの種類によって異なります。ストアドプロシージャーで
LAST_INSERT_ID()
の値を変更するステートメントが実行される場合は、プロシージャー呼び出しが続くステートメントで変更された値が参照されます。値を変更するストアドファンクションおよびトリガーの場合、関数またはトリガーの終了時に値がリストアされるため、後に続くステートメントには変更された値が表示されません。
生成された ID は、接続ごとにサーバー内に保持されます。 つまり、関数によって指定されたクライアントに返された値は、そのクライアントによって
AUTO_INCREMENT
カラムに影響を与える最近のステートメント用に最初に生成されたAUTO_INCREMENT
値です。 この値は、ほかのクライアントが独自のAUTO_INCREMENT
値を生成した場合でも影響を受ける可能性はありません。 この動作によって、各クライアントはほかのクライアントのアクティビティーを気にすることなく、ロックやトランザクションを実行しないで独自の ID を取得できます。行の
AUTO_INCREMENT
カラムを非「マジック」値 (つまり、NULL
でも0
でもない値) に設定する場合は、LAST_INSERT_ID()
の値が変更されません。重要単一の
INSERT
ステートメントを使用して複数の行を挿入する場合、LAST_INSERT_ID()
は、最初に挿入された行のみに対して生成された値を返します。 この理由は、ほかの一部のサーバーに対して同じINSERT
ステートメントを簡単に再現できるようにするためです。例:
mysql> USE test; mysql> CREATE TABLE t ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(10) NOT NULL ); mysql> INSERT INTO t VALUES (NULL, 'Bob'); mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | +----+------+ mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ mysql> INSERT INTO t VALUES (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa'); mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | +----+------+ mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 2 | +------------------+
2 番目の
INSERT
ステートメントで 3 つの新しい行がt
に挿入されましたが、これらの行の 1 番目に生成された ID は2
であり、あとに続くSELECT
ステートメントでも、この値がLAST_INSERT_ID()
によって返されます。INSERT IGNORE
を使用し、その行が無視された場合、LAST_INSERT_ID()
は現在の値から未変更のままです (接続で正常なINSERT
が実行されていない場合は、0 が返されます)。トランザクショナル以外のテーブルでは、AUTO_INCREMENT
カウンタが増分されません。InnoDB
テーブルでは、innodb_autoinc_lock_mode
が1
または2
に設定されている場合は、次の例で示すようにAUTO_INCREMENT
が増分されます。mysql> USE test; mysql> SELECT @@innodb_autoinc_lock_mode; +----------------------------+ | @@innodb_autoinc_lock_mode | +----------------------------+ | 1 | +----------------------------+ mysql> CREATE TABLE `t` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `val` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; # Insert two rows mysql> INSERT INTO t (val) VALUES (1),(2); # With auto_increment_offset=1, the inserted rows # result in an AUTO_INCREMENT value of 3 mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 # LAST_INSERT_ID() returns the first automatically generated # value that is successfully inserted for the AUTO_INCREMENT column mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ # The attempted insertion of duplicate rows fail but errors are ignored mysql> INSERT IGNORE INTO t (val) VALUES (1),(2); Query OK, 0 rows affected (0.00 sec) Records: 2 Duplicates: 2 Warnings: 0 # With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter # is incremented for the ignored rows mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 # The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+
詳細は、セクション15.6.1.6「InnoDB での AUTO_INCREMENT 処理」を参照してください。
expr
がLAST_INSERT_ID()
の引数として指定されている場合、引数の値は関数によって返され、LAST_INSERT_ID()
によって返される次の値として記憶されます。 これを使用すると、シーケンスのシミュレーションを行うことができます。-
シーケンスカウンタを保持するテーブルを作成し、それを初期化します。
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
-
そのテーブルを使用して、次のようにシーケンス番号を生成します。
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();
UPDATE
ステートメントは、シーケンスカウンタを増分し、LAST_INSERT_ID()
への次の呼び出しで更新された値が返されるようにします。SELECT
ステートメントは、その値を取得します。mysql_insert_id()
C API 関数を使用して、値を取得することもできます。 mysql_insert_id()を参照してください。
LAST_INSERT_ID()
を呼び出さずに、シーケンスを生成できます。このように関数を使用する有用性は、ID 値が最後に自動的に生成された値として保持されることです。 独自のシーケンス値を生成するほかのクライアントと互いに影響しあうことなく、複数のクライアントがUPDATE
ステートメントを発行し、SELECT
ステートメント (またはmysql_insert_id()
) で独自のシーケンス値を取得できるため、マルチユーザーでも安全です。mysql_insert_id()
はINSERT
およびUPDATE
ステートメントの後にのみ更新されるため、SELECT
やSET
などの他の SQL ステートメントを実行した後は、C API 関数を使用してLAST_INSERT_ID(
の値を取得できません。expr
) -
ROLES_GRAPHML()
メモリーロールサブグラフを表す GraphML 文書を含む
utf8
文字列を返します。<graphml>
要素のコンテンツを表示するには、ROLE_ADMIN
権限 (または非推奨のSUPER
権限) が必要です。 それ以外の場合、結果には空の要素のみが表示されます:mysql> SELECT ROLES_GRAPHML(); +---------------------------------------------------+ | ROLES_GRAPHML() | +---------------------------------------------------+ | <?xml version="1.0" encoding="UTF-8"?><graphml /> | +---------------------------------------------------+
-
ROW_COUNT()
ROW_COUNT()
は、次のように値を返します:DDL ステートメント: 0。 これは、
CREATE TABLE
やDROP TABLE
などのステートメントに適用されます。SELECT
以外の DML ステートメント: 影響を受ける行数です。 これは、UPDATE
、INSERT
またはDELETE
(以前と同様) などのステートメントに適用されますが、ALTER TABLE
やLOAD DATA
などのステートメントにも適用されるようになりました。SELECT
: ステートメントで結果セットが返される場合は -1、そうでない場合は「影響を受ける」行数。 たとえば、SELECT * FROM t1
の場合、ROW_COUNT()
は -1 を返します。SELECT * FROM t1 INTO OUTFILE '
の場合、file_name
'ROW_COUNT()
はファイルに書き込まれた行の数を返します。SIGNAL
ステートメント: 0。
UPDATE
ステートメントの場合、デフォルトで影響を受けた行の値は実際に変更された行の数です。 mysqld への接続時にCLIENT_FOUND_ROWS
フラグをmysql_real_connect()
に指定した場合、影響を受けた行の値は「見つかった」、つまりWHERE
句に一致した行数です。REPLACE
ステートメントの場合、影響を受けた行の値は、新しい行が古い行に置き換わった場合 2 です。この場合、重複が削除されたあとに行が挿入されたためです。INSERT ... ON DUPLICATE KEY UPDATE
ステートメントの場合、行ごとの影響を受けた行の値は、その行が新しい行として挿入された場合は 1、既存の行が更新された場合は 2、既存の行がその現在の値に設定された場合は 0 です。CLIENT_FOUND_ROWS
フラグを指定した場合、影響を受けた行の値は、既存の行がその現在の値に設定された場合は (0 ではなく) 1 になります。ROW_COUNT()
は、mysql_affected_rows()
C API 関数から取得される値と同様で、ステートメントの実行後に mysql クライアントに表示される行数です。mysql> INSERT INTO t VALUES(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t WHERE i IN(1,2); Query OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec)
重要ステートメントベースのレプリケーションでは、確実に
ROW_COUNT()
をレプリケートすることはできません。 行ベースのレプリケーションを使用すると、この関数は自動的にレプリケートされます。 -
SCHEMA()
この関数は
DATABASE()
のシノニムです。 -
SESSION_USER()
SESSION_USER()
はUSER()
のシノニムです。 -
SYSTEM_USER()
SYSTEM_USER()
はUSER()
のシノニムです。注記SYSTEM_USER()
関数は、SYSTEM_USER
権限とは異なります。 前者は、現在の MySQL アカウント名を返します。 後者は、システムユーザーと通常のユーザーアカウントカテゴリを区別します (セクション6.2.11「アカウントカテゴリ」 を参照)。 -
USER()
現在の MySQL ユーザー名とホスト名を
utf8
文字セット内の文字列として返します。mysql> SELECT USER(); -> 'davida@localhost'
この値は、サーバーへの接続時に指定したユーザー名および接続元のクライアントホストを示します。
CURRENT_USER()
の値とは異なる可能性があります。 -
VERSION()
MySQL サーバーのバージョンを示す文字列を返します。 この文字列では、
utf8
文字セットが使用されます。 値にはバージョン番号に加えて、サフィクスが付いている場合もあります。 セクション5.1.8「サーバーシステム変数」内のversion
システム変数の説明を参照してください。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。mysql> SELECT VERSION(); -> '8.0.29-standard'