AliSQLはシーケンスエンジン機能を提供します。 この機能により、RDSインスタンスでシーケンスエンジンを使用して、効率的な方法でシーケンス値を生成できます。
概要
ほとんどの場合、単調に増加する一意のシーケンス値は、単一ノード永続データベースシステムのプライマリキー、分散永続データベースシステムのグローバル一意識別子 (GUID) 、および複数の永続データベースシステム間のべき等性に必要です。 各データベースエンジンは、シーケンス値が一意であることを保証するために一意の方法を使用する。 たとえば、MySQLはAUTO_INCREMENT属性を提供し、OracleおよびSQL ServerはSEQUENCE属性を提供します。
MySQLデータベースでは、AUTO_INCREMENT属性を使用して日付やユーザー名などの一意のシーケンス値をカプセル化するプロセスに時間がかかります。 次のメソッドを使用して、一意のシーケンス値を効率的に生成できます。
アプリケーションまたはプロキシを使用してシーケンス値を生成します。 この方法の欠点は、シーケンス値のステータスがアプリケーションに送信されることにある。 この欠点は、スケーリングをより複雑にする。
シミュレートされたテーブルを使用してシーケンス値を生成します。 この方法では、ミドルウェアをインストールする必要があります。 ミドルウェアは、生成されたシーケンス値を取得するために使用されるロジックをカプセル化および簡略化するために使用されます。
シーケンスエンジンは、さまざまなデータベースエンジンと互換性があり、シーケンス値をより効率的に生成するのに役立ちます。
シーケンスエンジンは、MySQLで使用されるさまざまなストレージエンジンと互換性があります。 ただし、基になる永続データは、InnoDBやMyISAMなどの既存のストレージエンジンを使用して保存されます。これにより、XtraBackupなどのサードパーティ製ツールとの互換性が確保されます。 したがって、シーケンスエンジンは論理エンジンとしてのみ使用されます。
シーケンスエンジンは、シーケンスハンドラを使用してシーケンスオブジェクトにアクセスする。 これにより、NEXTVAL演算子を使用してシーケンスの値を増やし、キャッシュされたデータを管理できます。 データは基になる基本テーブルエンジンに送信されます。 ビジネス要件に基づいて、基になるベーステーブルエンジンからデータにアクセスできます。
前提条件
RDSインスタンスは、次のいずれかのMySQLバージョンを実行します。
20190816以降のマイナーエンジンバージョンでのMySQL 8.0
20210430以降のマイナーエンジンバージョンでのMySQL 5.7
20170901以降のマイナーエンジンバージョンでのMySQL 5.6
RDS Enterprise Editionを実行するRDSインスタンスはサポートされていません。
制限事項
シーケンスエンジンは、サブクエリまたはJOINクエリをサポートしていません。
SHOW CREATE TABLE
を使用してシーケンスにアクセスできます。テーブルを作成するときに、シーケンスエンジンを指定することはできません。 テーブルにシーケンスエンジンを指定する場合は、このトピックの「シーケンスの作成」セクションで説明されているステートメントを実行する必要があります。
シーケンスを作成するCreate a sequence
シーケンスを作成するには、次のステートメントを実行します。
CREATE SEQUENCE [存在しない場合] <データベース名>.<シーケンス名>
[<定数> で開始]
[MINVALUE <定数>]
[MAXVALUE <定数>]
[<定数> による増加]
[CACHE <constant> | NOCACHE]
[サイクル | NOCYCLE]
;
上記のステートメントを実行するときは、角かっこ ([]) で囲まれたパラメーターを設定する必要があります。
下表に、各パラメーターを説明します。
パラメーター | 説明 |
START WITH | シーケンスの開始値。 |
マリンバル | シーケンスの最小値。 |
MAXVALUE | シーケンスの最大値。 説明 シーケンスにNOCYCLEオプションを指定した場合、最大値に達すると次のエラーが報告されます。
|
による増加 | シーケンスの値が増加する増分。 |
キャッシュ /NOCACHE | キャッシュのサイズ。 RDSインスタンスのパフォーマンスを向上させるために、より大きなキャッシュサイズを指定できます。 RDSインスタンスを再起動すると、キャッシュに保存されているシーケンス値が失われます。 |
CYCLE /NOCYCLE | 最大値に達した後、シーケンスの値をMINVALUEパラメーターで指定された最小値にリセットするかどうかを指定します。 有効な値:
|
例:
シーケンスを作成する
1で始まる
minvalue 1
maxvalue 9999999
increment by 1
キャッシュ20
サイクル;
mysqldump拡張機能を使用してRDSインスタンスをバックアップする場合は、シーケンステーブルを作成し、シーケンステーブルに最初の行を挿入できます。 例:
CREATE TABLE schema.sequence_name ( 'currval' bigint (21) NOT NULL COMMENT'current value' 、
'nextval' bigint(21) NOT NULL COMMENT'next value' 、
'minvalue' bigint (21) NOT NULL COMMENT'min value' 、
'maxvalue' bigint (21) NOT NULL COMMENT'max value' 、
'start' bigint(21) NOT NULL COMMENT'start value' 、
'increment' bigint(21) NOT NULL COMMENT'increment value' 、
'cache' bigint(21) NOT NULL COMMENT'cache size '、
'cycle' bigint(21) NOT NULL COMMENT'cycle state' 、
'round 'bigint(21) NOT NULL COMMENT' すでにラウンド数'
) エンジン=シーケンスデフォルトCHARSET=latin1;
INSERT INTO schema.sequence_name VALUES(0,0、1,9223372036854775807、1,1、10000,1、0);
コミット;
シーケンステーブルの概要
シーケンスは、デフォルトのストレージエンジンを使用して作成されたテーブルに格納されます。 シーケンスをクエリすると、デフォルトのストレージエンジンを使用して作成されたテーブルが返されます。 例:
SHOW CREATE TABLE schema.sequence_name;
CREATE TABLEスキーマ。sequence_name ()
'currval' bigint(21) NOT NULL COMMENT'current value' 、
'nextval' bigint(21) NOT NULL COMMENT'next value' 、
'minvalue' bigint (21) NOT NULL COMMENT'min value' 、
'maxvalue' bigint (21) NOT NULL COMMENT'max value' 、
'start' bigint(21) NOT NULL COMMENT'start value' 、
'increment' bigint(21) NOT NULL COMMENT'increment value' 、
'cache' bigint(21) NOT NULL COMMENT'cache size '、
'cycle' bigint(21) NOT NULL COMMENT'cycle state' 、
'round 'bigint(21) NOT NULL COMMENT' すでにラウンド数'
) エンジン=シーケンスデフォルトCHARSET=latin1
クエリ構文
シーケンスエンジンは、次の構文をサポートします。
SELECT nextval(<シーケンス名>) 、currval(<シーケンス名>) FROM <シーケンス名>;
説明構文は、MySQL 8.0とMySQL 5.7でサポートされています。
SELECT <シーケンス名>.currval, <シーケンス名>.nextval FROM dual;
説明構文は、MySQL 8.0、MySQL 5.7、およびMySQL 5.6でサポートされています。
例:
mysql> SELECT test.currval、test.nextval from dual;
+ ------------ ------------------- +
| test.currval | test.nextval |
+ ------------ ------------------- +
| 24 | 25 |
+ ------------ ------------------- +
セットの1列 (0.03秒)
新しいシーケンスの値を照会する前に、次のステートメントを実行してシーケンスのNEXTVALを呼び出す必要があります。 それ以外の場合、シーケンス 'xxx' は現在のセッションでまだ定義されていません
エラーメッセージが表示されます。
例:
SELECT <シーケンス名>.nextval FROM dual;