表12.18情報関数
名前 | 説明 |
---|---|
基准() |
式を繰り返し実行します |
字符集() |
引数の文字セットを返します |
可压缩性() |
文字列引数の照合順序強制性値を返します |
排序() |
文字列引数の照合順序を返します |
CONNECTION_ID () |
接続のための接続id(スレッドid)を返します |
CURRENT_USER () ,CURRENT_USER |
認証済みユザ名とホスト名 |
数据库() |
デフォルト(現在)のデタベス名を返します |
FOUND_ROWS () |
限制句付き选择で,限制句がない場合に戻される可能性がある行の数です |
LAST_INSERT_ID () |
前回の插入でのautoincrementカラムの値です |
ROW_COUNT () |
更新された行数 |
模式() |
数据库()のシノニムです |
为SESSION_USER () |
用户()のシノニムです |
SYSTEM_USER () |
用户()のシノニムです |
用户() |
ユザ名と,クラアントによって提供されるホスト名です |
(版本) |
MySQLサバのバジョンを示す文字列を返します |
基准()
関数は,式expr
を数
の回数だけ繰り返し実行します。MySQLによる式の処理速度を計測する際に使用される場合もあります。結果の値は常に0
になります。この使用目的は,mysqlクラopenstackアント内から,クエリopenstackの実行時間をレポopenstackトすることです。mysql >选择基准(1000000,编码(“你好”,“再见”));+----------------------------------------------+ | 基准(1000000,编码(“你好”、“再见 ')) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1行集(4.74秒)
レポートされる時間は,クライアント側での経過時間であり,サーバー側でのCPU時間ではありません。
基准()
を複数回実行し,サ。基准()
の目的は,スカラ式の実行時パフォマンスを測定することです。これにより,その使用方法や結果の解釈方法に,重要ないく。スカラ式しか使用できません。式をサブクエリーにすることはできますが,単一のカラムおよび最大でも単一の行が返される必要があります。たとえば,テブル
t
に複数のカラムや複数の行が含まれていると,BENCHMARK(10, (SELECT * FROM t))
は失敗します。选择
ステトメントをexpr
N
回実行する場合と,选择基准(
を実行する場合とでは,発生するオバヘッドの量が異なります。この2。前者では,パ,オプティマ,テ,および実行時評価がそれぞれN
,expr
)N
回ず発生します。後者では,実行時評価のみがN
回発生し,その他のすべてのコンポネントは1回だけ発生します。割り当て済みのメモリー構造体は再使用され,集約関数で評価済みの結果をローカルキャッシュに入れるなどの実行時最適化によって,結果が変わる可能性もあります。したがって,基准()
を使用して,実行時コンポーネントに高い重みを付加し,ネットワーク,パーサー,オプティマイザなどで導入された「ノイズ」を削除することで,そのコンポネントのパフォマンスが測定されます。
文字列引数の文字セットを返します。
mysql >选择字符集(' abc ');——> 'latin1' mysql> SELECT CHARSET('abc' USING utf8));- mysql> 'utf8' SELECT CHARSET(USER());——>“use utf8”
文字列引数の照合順序強制性値を返します。
mysql> SELECT ('abc' COLLATE latin1_swedish_ci);mysql: SELECT (USER());3 mysql> SELECT mandatory ('abc');- > 4
戻り値の意味は,次の表に示すとおりです。値が低いほど,優先順位は高くなります。
型変換属性 意味 例 0
明示的な照合順序 核对
句の値1
照合順序なし さまざまな照合順序との文字列の連結 2
暗黙的な照合順序 カラム値,ストアドルチンパラメタ,またはロカル変数 3.
系統定数 用户()
の戻り値4
型変換可能 リテラル文字列 5
無視可能 零
または零
から派生した式文字列引数の照合順序を返します。
mysql >选择排序(' abc ');-> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc');——>“utf8_general_ci”
接続用の接続id(スレッドid)を返します。すべての接続は,現在接続されているクラ邮箱アントのセット間で一意のidを持っています。
CONNECTION_ID ()
で返される値の型は,INFORMATION_SCHEMA。PROCESSLIST
テブルのID
カラム,显示PROCESSLIST
出力のId
カラム,およびパフォマンススキマ线程
テブルのPROCESSLIST_ID
カラムに表示される値と同じです。mysql >选择CONNECTION_ID ();- > 23786
現在のクライアントを認証する際にサーバーで使用されたMySQLアカウントを表すユーザー名とホスト名の組み合わせを返します。このアカウントで,アクセス権限が決まります。戻り値は,
use utf8
文字セット内の文字列です。CURRENT_USER ()
の値は,用户()
の値とは異なる可能性があります。mysql >选择用户();——> 'davida@localhost' mysql> SELECT * FROM mysql.user;错误1044:用户访问mysql数据库的权限被拒绝——>“@localhost”
この例は、クラ以及アントが
黛维达
のユザ名を指定(用户()
関数の値で指定されます)したが,サ(CURRENT_USER ()
値の空のユザ名部分に表示されます)を使用してクラ。これが発生する原因として,黛维达
の付与テブルにアカウントが一覧表示されていないことが考えられます。ストアドプログラムまたはビュでは,
SQL安全调用程序
特性で定義されていなければ,CURRENT_USER ()
はオブジェクトを定義したユザ(その.定义者
値で指定されます)のアカウントを返します。後者の場合,CURRENT_USER ()
はオブジェクトを呼び出したユザを返します。トリガおよびベントには,
SQL安全
特性を定義するためのオプションがありません。したがって,このようなオブジェクトの場合,CURRENT_USER ()
はオブジェクトを定義したユザのアカウントを返します。呼び出したユザを返すには,用户()
または为SESSION_USER ()
を使用します。次のステートメントでは,影響を受けるユーザーや定義したユーザーの名前(ホストの可能性もあります)の代わりに,
CURRENT_USER ()
関数を使用することがサポトされています。このような場合,必要に応じてCURRENT_USER ()
が拡張されます。减少用户
重命名用户
格兰特
撤销
创建函数
创建过程
创建触发器
创建事件
创建视图
改变事件
改变观点
设置密码
このような
CURRENT_USER ()
の拡張がさまざまなMySQL 5.6リリスのレプリケションで持セクション17.4.1.7 " current_user()のレプリケション"を参照してください。デフォルト(現在)のデタベス名を
use utf8
文字セット内の文字列として返します。デフォルトのデタベスがない場合は,数据库()
は零
を返します。ストアドルーチン内では,デフォルトのデータベースはルーチンが関連付けられたデータベースですが,これは呼び出し元のコンテキストでのデフォルトのデータベースと同じであるとはかぎりません。mysql >选择数据库();——>“测试”
デフォルトのデタベスがない場合は,
数据库()
は零
を返します。サバからクラアントに返される行の数を制限するために,
选择
ステトメントに限制
句が含まれている場合があります。場合によっては,ステ,トメントを再度実行せずに,限制
を付けなかった場合にステトメントで返されるはずの行数を知っておくことが望ましいことがあります。この行数を取得するには,选择
ステトメントにSQL_CALC_FOUND_ROWS
オプションを付けてから,FOUND_ROWS ()
を呼び出します。SELECT SQL_CALC_FOUND_ROWS * FROMtbl_name- WHERE id > 100 LIMIT 10;mysql >选择FOUND_ROWS ();
2番目の
选择
は,1番目の选择
を限制
句なしで記述した場合に返される行数を示す数字を返します。最近成功した
选择
ステトメントにSQL_CALC_FOUND_ROWS
オプションを付けなければ,FOUND_ROWS ()
は,そのステトメントで返された結果セットの行数を返します。ステトメントに限制
句が含まれている場合,FOUND_ROWS ()
はその制限値以下の行数を返します。たとえば,ステトメントに限制10
または限制50,10
が含まれている場合,FOUND_ROWS ()
はそれぞれ10と60を返します。FOUND_ROWS ()
から取得できる行数は一時的なもので,选择SQL_CALC_FOUND_ROWS
ステトメントのあとに,このステトメントを発行しても取得できるようには設計されていません。あとで値を参照する必要がある場合は,保存してください。SELECT SQL_CALC_FOUND_ROWS * FROM…;SET @rows = FOUND_ROWS();
选择SQL_CALC_FOUND_ROWS
を使用している場合は,MySQLでは完全な結果セット内の行数を計算する必要があります。ただし,結果セットはクラ限制
なしでクエリを再度実行するよりも速くなります。SQL_CALC_FOUND_ROWS
およびFOUND_ROWS ()
は,クエリーで返される行数を制限するが,クエリーを再度実行しないで完全な結果セット内の行数を確認する必要がある状況でも役立ちます。例として,検索結果のほかのセクションを表示するページへのリンクを含むページが表示されるWebスクリプトがあります。FOUND_ROWS ()
を使用すると,残りの結果を表示するために必要なその他のペジ数を確認できます。SQL_CALC_FOUND_ROWS
およびFOUND_ROWS ()
を使用すると,联盟
の複数箇所で限制
が発生する可能性があるため,単純な选择
ステトメントよりも,联盟
ステトメントで使用した方が複雑になります。これは,联盟
内の個々の选择
ステトメントに適用される場合と,联盟
の結果全体にグロバルに適用される場合があります。联盟
でSQL_CALC_FOUND_ROWS
を使用する目的は,グロバルな限制
なしで返される行数を返すことです。联盟
でSQL_CALC_FOUND_ROWS
を使用する条件は,次のとおりです。联盟
の1番目の选择
に,SQL_CALC_FOUND_ROWS
キワドが表示される必要があります。FOUND_ROWS ()
の値は,UNION ALL
が使用されている場合にのみ正確です。所有
なしで联盟
が使用される場合は,重複の削除が発生し,FOUND_ROWS ()
の値が単なる近似値になります。联盟
で限制
が表示されない場合は,SQL_CALC_FOUND_ROWS
が無視され,联盟
を処理するために作成された一時テブル内の行数が返されます。
ここで説明した以外のケスでは,
FOUND_ROWS ()
の動作(エラが発生して)选择
ステトメントに失敗したあとの値など)が定義されません。重要ステトメントベスのレプリケションでは,確実に
FOUND_ROWS ()
をレプリケトすることはできません。行ベスのレプリケションを使用すると,この関数は自動的にレプリケトされます。LAST_INSERT_ID ()
、LAST_INSERT_ID (
expr
)LAST_INSERT_ID ()
に引数を付けない場合は,最近実行された插入
ステトメントの結果として,最初に自動的に生成され,正常にAUTO_INCREMENT
カラムに挿入された値を表す64ビット値が返されます。この値の型は,MySQL 5.6.9の時点では长整型数字无符号
,それよりも前では长整型数字
(符号付き)です。正常に挿入された行がない場合は,LAST_INSERT_ID ()
の値は未変更のままです。LAST_INSERT_ID ()
に引数を付けない場合は,MySQL 5.6.9の時点では符号なし整数,それよりも前では符号付き整数が返されます。たとえば,
AUTO_INCREMENT
値を生成する行を挿入したあとは,次のようにして値を取得できます。mysql >选择LAST_INSERT_ID ();- > 195
現在実行中のステトメントによって,
LAST_INSERT_ID ()
の値は影響を受けません。1のステトメントでAUTO_INCREMENT
値を生成してから,独自のAUTO_INCREMENT
カラムを含むテブルに行を挿入する複数行の插入
ステトメントでLAST_INSERT_ID ()
を参照すると仮定します。LAST_INSERT_ID ()
の値は,2番目のステトメントでも未変更のままです。2番目以降の行でも、その値は以前に行われた行の挿入による影響を受けません。(ただし、LAST_INSERT_ID ()
とLAST_INSERT_ID (
への参照を混在させると,効果は定義されません。)expr
)以前のステトメントでエラが返された場合は,
LAST_INSERT_ID ()
の値が定義されません。トランザクションテブルでは,エラ,LAST_INSERT_ID ()
の値は未定義のままです。手動の回滚
では,LAST_INSERT_ID ()
の値はトランザクション前の値にリストアされず,回滚
時点と同じままです。MySQL 5.6.15よりも前では,レプリケーションのフィルタ処理ルールが使用されている場合に,この関数が正常にレプリケートされませんでした。(Bug #17234370, Bug #69861)
ストアドルチン(プロシジャや関数)またはトリガの本文内では,
LAST_INSERT_ID ()
の値は,このような種類のオブジェクトの本文外で実行されたステトメントと同様に変更されます。あとに続くステトメントで参照されるLAST_INSERT_ID ()
の値でのストアドルチンまたはトリガの効果は,ルチンの種類によって異なります。ストアドプロシジャで
LAST_INSERT_ID ()
の値を変更するステートメントが実行される場合は,プロシージャー呼び出しが続くステートメントで変更された値が参照されます。値を変更するストアドファンクションおよびトリガーでは,値は関数やトリガーが終了したときにリストアされ,あとに続くステートメントでは変更された値が参照されません。
生成されたidは,接続ごとにサバ内に保持されます。つまり,関数によって指定されたクライアントに返された値は,そのクラ邮箱アントによって
AUTO_INCREMENT
カラムに影響を与える最近のステトメント用に最初に生成されたAUTO_INCREMENT
値です。この値は、ほかのクラ以及アントが独自のAUTO_INCREMENT
値を生成した場合でも影響を受ける可能性はありません。この動作によって,各クライアントはほかのクライアントのアクティビティーを気にすることなく,ロックやトランザクションを実行しないで独自のIDを取得できます。行の
AUTO_INCREMENT
カラムを非「マジック」値(まり,零
でも0
でもない値)に設定する場合は,LAST_INSERT_ID ()
の値が変更されません。重要単一の
插入
ステトメントを使用して複数の行を挿入する場合,LAST_INSERT_ID ()
は,最初に挿入された行のみに対して生成された値を返します。この理由は,ほかの一部のサバに対して同じ插入
ステトメントを簡単に再現できるようにするためです。例:
mysql >使用测试;Database changed mysql> CREATE TABLE t (-> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> name VARCHAR(10) NOT NULL ->);查询OK, 0行影响(0.09秒)mysql> INSERT INTO t VALUES (NULL, 'Bob');查询OK, 1行影响(0.01秒)mysql> SELECT * FROM t;+----+------+ | id |名称 | +----+------+ | 1 |鲍勃 | +----+------+ 1行组(0.01秒)mysql >选择LAST_INSERT_ID ();+------------------+ | LAST_INSERT_ID () | +------------------+ | 1 | +------------------+ 1行集(0.00秒)mysql >插入t值- > (NULL,“玛丽”),(NULL,“简”),(NULL,“丽莎”);查询OK, 3 rows affected (0.00 sec) Records: 3 duplicate: 0 Warnings: 0 mysql> SELECT * FROM t;+----+------+ | id |名称 | +----+------+ | 玛丽鲍勃| 1 | | 2 | | | 3 |简| | 4 |丽莎 | +----+------+ 4行集(0.01秒)mysql >选择LAST_INSERT_ID ();+------------------+ | LAST_INSERT_ID () | +------------------+ | 2 | +------------------+ 1行集(0.00秒)
2番目の
插入
ステトメントで3の新しい行がt
に挿入されましたが,これらの行の1番目に生成されたidは2
であり,あとに続く选择
ステトメントでも,この値がLAST_INSERT_ID ()
によって返されます。插入忽略
を使用し,その行が無視された場合,LAST_INSERT_ID ()
は現在の値から未変更のままです(接続で正常な.插入
が実行されていない場合は,0が返されます)。トランザクショナル以外のテブルでは,AUTO_INCREMENT
カウンタが増分されません。InnoDB
テブルでは,innodb_autoinc_lock_mode
が1
または2
に設定されている場合は,次の例で示すようにAUTO_INCREMENT
が増分されます。mysql >使用测试;SELECT @@innodb_autoinc_lock_mode;+----------------------------+ | @@ innodb_autoinc_lock_mode | +----------------------------+ | 1 | +----------------------------+ 1行组(0.00秒)mysql >创建表“t”(“id”INT(11)不是零AUTO_INCREMENT,“val”INT(11)默认为空,主键(id),唯一键的i1 (val))引擎= InnoDB默认字符集= latin1;中的一个查询OK, 0 rows affected(0.02秒)——Insert two rows mysql> Insert INTO t (val) VALUES (1),(2);查询OK, 2行影响(0.00 sec)记录:2重复:0警告:0——auto_increment_offset=1,插入的行——结果AUTO_INCREMENT值为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=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 1 row in set (0.00 sec)——LAST_INSERT_ID()返回AUTO_INCREMENT列成功插入的第一个自动生成的——值mysql> SELECT LAST_INSERT_ID();+------------------+ | LAST_INSERT_ID () | +------------------+ | 1 | +------------------+ 1行组(0.00秒)——企图插入重复的行失败但错误是忽略了mysql >忽略插入t (val)值(1),(2);查询OK, 0 rows affected (0.00 sec) Records: 2 duplicate: 2 warning: 0——innodb_autoinc_lock_mode=1, AUTO_INCREMENT计数器——为被忽略的行递增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=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 1 row in set (0.00 sec)——LAST_INSERT_ID是不变的,因为之前的插入是不成功的mysql> SELECT LAST_INSERT_ID();+------------------+ | LAST_INSERT_ID () | +------------------+ | 1 | +------------------+ 1行集(0.00秒)
詳細は,セクション14.6.5 " InnoDBでのAUTO_INCREMENT処理"を参照してください。
expr
がLAST_INSERT_ID ()
への引数として指定されている場合は,その引数の値が関数によって返され,LAST_INSERT_ID ()
によって次に返される値として記憶されます。これを使用すると,シケンスのシミュレションを行うことができます。シケンスカウンタを保持するテブルを作成し,それを初期化します。
CREATE TABLE sequence (id INT NOT NULL);INSERT INTO sequence VALUES (0);
そのテブルを使用して,次のようにシケンス番号を生成します。
UPDATE sequence SET id=LAST_INSERT_ID(id+1);mysql >选择LAST_INSERT_ID ();
更新
ステトメントは,シケンスカウンタを増分し,LAST_INSERT_ID ()
への次の呼び出しで更新された値が返されるようにします。选择
ステトメントは,その値を取得します。mysql_insert_id ()
C API関数を使用して,値を取得することもできます。セクション23.7.7.37 " mysql_insert_id() "を参照してください。
LAST_INSERT_ID ()
を呼び出さずに,シケンスを生成できます。このように関数を使用する有用性は,id値が最後に自動的に生成された値として保持されることです。独自のシケンス値を生成するほかのクラ更新
ステトメントを発行し,选择
ステトメント(またはmysql_insert_id ()
)で独自のシケンス値を取得できるため,マルチユでも安全です。mysql_insert_id ()
関数は,插入
および更新
ステトメントのあとにしか更新されないため,选择
や集
などのその他のSQLステトメントを実行したあとに,このc API関数を使用しても,LAST_INSERT_ID (
の値を取得できません。expr
)MySQL 5.6では;
ROW_COUNT ()
は次のように値を返します。DDLステトメント:0。これは,
创建表
や删除表
などのステトメントに適用されます。选择
以外のDMLステトメント:影響を受ける行数です.これは,(以前と同様に)更新
、插入
、删除
などのステトメントに適用されますが,ALTER TABLE
や数据加载INFILE
などのステトメントにも適用されるようになりました。选择
:ステトメントで結果セットが返される場合は-1,そうでない場合は「影響を受ける」行数。たとえば,SELECT * FROM t1
の場合,ROW_COUNT ()
は-1を返します。SELECT * FROM t1 INTO OUTFILE '
の場合,file_name
'ROW_COUNT ()
はファ邮箱ルに書き込まれた行の数を返します。信号
ステトメント:0。
更新
ステトメントの場合,デフォルトで影響を受けた行の値は実際に変更された行の数です。mysqldへの接続時にCLIENT_FOUND_ROWS
フラグをmysql_real_connect ()
に指定した場合,影響を受けた行の値は「見かった」、まり在哪里
句に一致した行数です。取代
ステトメントの場合,影響を受けた行の値は,新しい行が古い行に置き換わった場合2です。この場合,重複が削除されたあとに行が挿入されたためです。插入……重复密钥更新
ステートメントの場合,行ごとの影響を受けた行の値は,その行が新しい行として挿入された場合は1,既存の行が更新された場合は2,既存の行がその現在の値に設定された場合は0です。CLIENT_FOUND_ROWS
フラグを指定した場合,影響を受けた行の値は,既存の行がその現在の値に設定された場合は(0ではなく)1になります。ROW_COUNT ()
は,mysql_affected_rows ()
C API関数から取得される値と同様で,ステ,トメントの実行後にmysqlクラ邮箱アントに表示される行数です。INSERT INTO t VALUES(1),(2),(3);查询OK, 3 rows affected (0.00 sec) Records: 3 duplicate: 0 Warnings: 0 mysql> SELECT ROW_COUNT();+-------------+ | ROW_COUNT () | +-------------+ | 3 | +-------------+ 1行集(0.00秒)mysql >删除从t,我在(1、2);查询OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT();+-------------+ | ROW_COUNT () | +-------------+ | 2 | +-------------+ 1行集(0.00秒)
重要ステトメントベスのレプリケションでは,確実に
ROW_COUNT ()
をレプリケトすることはできません。行ベスのレプリケションを使用すると,この関数は自動的にレプリケトされます。この関数は
数据库()
のシノニムです。为SESSION_USER ()
は用户()
のシノニムです。SYSTEM_USER ()
は用户()
のシノニムです。現在のMySQLユザ名とホスト名を
use utf8
文字セット内の文字列として返します。mysql >选择用户();——>“davida@localhost”
この値は,サ。
CURRENT_USER ()
の値とは異なる可能性があります。次のように,ユザ名の部分のみを抽出できます。
mysql >选择SUBSTRING_INDEX(用户(),' @ ',1);——>“黛维达”
MySQLサバのバジョンを示す文字列を返します。この文字列では,
use utf8
文字セットが使用されます。値にはバジョン番号に加えて,サフィクスが付いている場合もあります。セクション5.1.4 "サバシステム変数"内の版本
システム変数の説明を参照してください。この関数は,ステトメントベスのレプリケションでは安全に使用できません。
binlog_format
が声明
に設定されているときに,この関数を使用すると,警告のログが記録されます。mysql >选择版本();——>“5.6.23-standard”