AliSQL は、シーケンス値を取得するプロセスを簡素化するために Sequence エンジンを提供します。
概要
永続的なデータベースシステムでは、単一ノード上のビジネスプライマリキー、分散システム内のグローバル一意識別子、または複数システム間のべき等性コントロールなどのユースケースで、単調増加の一意の値が必要になることがよくあります。さまざまなデータベースシステムが、異なる実装方法を提供しています。たとえば、MySQL は AUTO_INCREMENT 属性を提供し、Oracle と SQL Server は SEQUENCE オブジェクトを提供します。
MySQL データベースでは、日付やユーザー ID などの追加情報で一意の値をカプセル化する場合、AUTO_INCREMENT の使用は不便なことがあります。実際には、さまざまな回避策が使用されます:
アプリケーションまたはプロキシからシーケンス値を生成します。しかし、アプリケーション側で状態を維持すると、スケールアウト/スケールインが複雑になります。
データベース内の模擬テーブルからシーケンス値を生成します。この方法では、一意の値を取得するロジックをカプセル化して簡素化するためにミドルウェアが必要です。
Sequence エンジンは、他のデータベースで使用される方法と可能な限り互換性があるように設計されています。
Sequence エンジンは MySQL ストレージエンジンのインターフェイスを実装しますが、InnoDB や MyISAM などの既存のストレージエンジンを使用して永続的なデータを格納します。これにより、XtraBackup のようなサードパーティ製ツールとの互換性が確保されます。したがって、Sequence エンジンは論理エンジンです。
Sequence エンジンは、Sequence ハンドラ インターフェイスを介して Sequence オブジェクトにアクセスし、NEXTVAL の値の更新とキャッシュ管理を行います。その後、リクエストをベーステーブルのストレージエンジンに渡して、最終的なデータアクセスを行います。
前提条件
インスタンスは、次のいずれかのバージョンである必要があります:
RDS for MySQL 8.4
RDS for MySQL 8.0 (マイナーエンジンバージョン 20190816 以降)
RDS for MySQL 5.7 (マイナーエンジンバージョン 20210430 以降)
RDS for MySQL 5.6 (マイナーエンジンバージョン 20170901 以降)
この機能は、RDS Enterprise Edition インスタンスではサポートされていません。
制限事項
シーケンスはサブクエリや結合をサポートしていません。
SHOW CREATE TABLEを使用して、シーケンスの構造を表示できます。テーブル作成時に Sequence エンジンを指定することはできません。シーケンステーブルは、シーケンスの作成構文を使用してのみ作成できます。
シーケンスの作成
CREATE SEQUENCE [IF NOT EXISTS] <database_name>.<sequence_name>
[START WITH <constant>]
[MINVALUE <constant>]
[MAXVALUE <constant>]
[INCREMENT BY <constant>]
[CACHE <constant> | NOCACHE]
[CYCLE | NOCYCLE]
;角括弧 ([]) 内のパラメーターはオプションです。
次の表で各パラメーターについて説明します。
パラメーター | 説明 |
START WITH | シーケンスの開始値。 |
MINVALUE | シーケンスの最小値。 |
MAXVALUE | シーケンスの最大値。 説明 NOCYCLE を指定した場合、最大値に達すると次のエラーが返されます: |
INCREMENT BY | 連続するシーケンス値間の増分値。 |
CACHE/NOCACHE | キャッシュサイズ。パフォーマンスを向上させるために、大きなキャッシュサイズを設定できます。ただし、インスタンスが再起動すると、キャッシュ内の未使用の値は失われます。 |
CYCLE/NOCYCLE | シーケンスが使い果たされた後、MINVALUE から再開できるかどうかを指定します。有効な値:
|
例:
create sequence s
start with 1
minvalue 1
maxvalue 9999999
increment by 1
cache 20
cycle;mysqldump を使用して作成されたバックアップとの互換性を確保するために、シーケンステーブルを作成して初期レコードを挿入することでもシーケンスを作成できます。例:
CREATE TABLE schema.sequence_name ( `currval` bigint(21) NOT NULL COMMENT '現在の値',
`nextval` bigint(21) NOT NULL COMMENT '次の値',
`minvalue` bigint(21) NOT NULL COMMENT '最小値',
`maxvalue` bigint(21) NOT NULL COMMENT '最大値',
`start` bigint(21) NOT NULL COMMENT '開始値',
`increment` bigint(21) NOT NULL COMMENT '増分値',
`cache` bigint(21) NOT NULL COMMENT 'キャッシュサイズ',
`cycle` bigint(21) NOT NULL COMMENT 'サイクル状態',
`round` bigint(21) NOT NULL COMMENT 'サイクル回数'
) ENGINE=Sequence DEFAULT CHARSET=latin1;
INSERT INTO schema.sequence_name VALUES(0,0,1,9223372036854775807,1,1,10000,1,0);
COMMIT;シーケンステーブルの定義
シーケンスはテーブルに格納されます。SHOW CREATE TABLE コマンドを実行することで、その定義を表示できます。例:
SHOW CREATE TABLE schema.sequence_name;
CREATE TABLE schema.sequence_name (
`currval` bigint(21) NOT NULL COMMENT '現在の値',
`nextval` bigint(21) NOT NULL COMMENT '次の値',
`minvalue` bigint(21) NOT NULL COMMENT '最小値',
`maxvalue` bigint(21) NOT NULL COMMENT '最大値',
`start` bigint(21) NOT NULL COMMENT '開始値',
`increment` bigint(21) NOT NULL COMMENT '増分値',
`cache` bigint(21) NOT NULL COMMENT 'キャッシュサイズ',
`cycle` bigint(21) NOT NULL COMMENT 'サイクル状態',
`round` bigint(21) NOT NULL COMMENT 'サイクル回数'
) ENGINE=Sequence DEFAULT CHARSET=latin1クエリ構文
シーケンスは、次のクエリ構文をサポートしています:
SELECT nextval(<sequence_name>),currval(<sequence_name>) FROM <sequence_name>;説明RDS for MySQL 8.4、8.0、5.7 で利用できます。
SELECT <sequence_name>.currval, <sequence_name>.nextval FROM dual;説明RDS for MySQL 8.4、8.0、5.7、5.6 で利用できます。
例:
mysql> SELECT test.currval, test.nextval from dual;
+--------------+--------------+
| test.currval | test.nextval |
+--------------+--------------+
| 24 | 25 |
+--------------+--------------+
1 row in set (0.03 sec)
新しく作成されたシーケンスの場合、クエリを実行する前に、一度 NEXTVAL を呼び出して初期化する必要があります。そうしないと、Sequence 'xxx' is not yet defined in current session エラーが返されます。
NEXTVAL 呼び出しの例:
SELECT <sequence_name>.nextval FROM dual;