MySQL 8.0 リファレンスマニュアル


12.16 情報関数

表 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() 関数は、式 exprcount の回数だけ繰り返し実行します。 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(N, expr) を実行する場合とでは、発生するオーバーヘッドの量が異なります。 この 2 つは非常に異なる実行プロファイルを持つため、両者の所要時間は同一になりません。 前者では、パーサー、オプティマイザ、テーブルロック、および実行時評価がそれぞれ 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 番目の SELECTLIMIT 句なしで記述した場合に返される行数を示す数字を返します。

    最近成功した 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 の結果全体にグローバルに適用される場合があります。

    UNIONSQL_CALC_FOUND_ROWS を使用する目的は、グローバルな LIMIT なしで返される行数を返すことです。 UNIONSQL_CALC_FOUND_ROWS を使用する条件は、次のとおりです。

    • UNION の 1 番目の SELECT に、SQL_CALC_FOUND_ROWS キーワードが表示される必要があります。

    • FOUND_ROWS() の値は、UNION ALL が使用されている場合にのみ正確です。 ALL なしで UNION が使用される場合は、重複の削除が発生し、FOUND_ROWS() の値が単なる近似値になります。

    • UNIONLIMIT が表示されない場合は、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_mode1 または 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 処理」を参照してください。

    exprLAST_INSERT_ID() の引数として指定されている場合、引数の値は関数によって返され、LAST_INSERT_ID() によって返される次の値として記憶されます。 これを使用すると、シーケンスのシミュレーションを行うことができます。

    1. シーケンスカウンタを保持するテーブルを作成し、それを初期化します。

      mysql> CREATE TABLE sequence (id INT NOT NULL);
      mysql> INSERT INTO sequence VALUES (0);
    2. そのテーブルを使用して、次のようにシーケンス番号を生成します。

      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 ステートメントの後にのみ更新されるため、SELECTSET などの他の 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 TABLEDROP TABLE などのステートメントに適用されます。

    • SELECT 以外の DML ステートメント: 影響を受ける行数です。 これは、UPDATEINSERT または DELETE (以前と同様) などのステートメントに適用されますが、ALTER TABLELOAD 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_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

    mysql> SELECT VERSION();
            -> '8.0.29-standard'

関連キーワード:  関数, INSERT, ステートメント, FOUND, ROWS, 実行, AUTO, INCREMENT, LIMIT, 影響