このセクションでは、Oracleモードでのシーケンスの作成、表示、変更、削除の方法について説明します。
OceanBaseデータベースでは、シーケンス(Sequence)はOracleテナントのデータベースオブジェクトであり、重複しない値を生成できます。これは、テーブルの主キーとして重複しない列が必要な場合に非常に有用です。
シーケンスは、現在のシーケンス値と次のシーケンス値を返すための2つの疑似列 CURRVAL と NEXTVAL を提供します。NEXTVAL がクエリされるたびに、CURRVAL の値は進みます。
シーケンスの制限
HAVING、ORDER BY、GROUP BYなどのステートメントと同時に使用できません。- サブクエリ内では使用できません(
INSERT INTO SELECTの場合は除く)。 WHERE式には使用できません。
シーケンスの作成
CREATE SEQUENCE ステートメントを使用してシーケンスを作成できます。構文は以下のとおりです:
CREATE SEQUENCE sequence_name
[MINVALUE value | NOMINVALUE]
[MAXVALUE value | NOMAXVALUE]
[START WITH value]
[INCREMENT BY value]
[CACHE value | NOCACHE]
[ORDER | NOORDER]
[CYCLE | NOCYCLE];
ここで:
MINVALUEとMAXVALUEは、最小値と最大値を指定するために使用されます。START WITHは、開始値を指定するために使用されます。INCREMENT BYは、ステップサイズを指定するために使用されます。負の数も指定でき、デフォルトは 1 です。CACHEは、パフォーマンス向上のために一部のシーケンス値をキャッシュするために使用され、高並行性環境での使用が推奨されます。説明
分散システムで Sequence を使用する際、
CACHE+NOORDERオプションを使用した場合、異なるマシンに接続すると、取得するシーケンスは順序立てられていない増分値になりますが、一意性は保証されます。CYCLEは、シーケンス値が繰り返し使用されるかどうかを指定するために使用されます。シーケンス値が繰り返し使用される場合は、最大値または最小値を指定する必要があります。
CREATE SEQUENCE ステートメントの詳細については、CREATE SEQUENCEを参照してください。
例:シーケンスを作成し、テーブルの列の自動インクリメントを実現します。
obclient> CREATE TABLE t1(id number NOT NULL PRIMARY KEY, name varchar(50) , gmt_create date NOT NULL DEFAULT SYSDATE);
Query OK, 0 rows affected
obclient> CREATE SEQUENCE seq_t1 START WITH 10000 INCREMENT BY 1 CACHE 50 NOCYCLE;
Query OK, 0 rows affected
obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'A');
Query OK, 1 row affected (0.02 sec)
obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'B');
Query OK, 1 row affected (0.00 sec)
obclient> INSERT INTO t1(id,name) VALUES(seq_t1.nextval, 'C');
Query OK, 1 row affected (0.00 sec)
obclient> SELECT * FROM t1;
+-------+------+---------------------+
| ID | NAME | GMT_CREATE |
+-------+------+---------------------+
| 10000 | A | 2020-04-02 18:30:29 |
| 10001 | B | 2020-04-02 18:30:34 |
| 10002 | C | 2020-04-02 18:30:39 |
+-------+------+---------------------+
3 rows in set (0.01 sec)
シーケンスの確認
シーケンスの作成が完了すると、USER_SEQUENCES、ALL_SEQUENCES、およびDBA_SEQUENCESビューを使用して、作成したシーケンスを確認できます。
例:
obclient> SELECT * FROM USER_SEQUENCES \G
*************************** 1. row ***************************
SEQUENCE_NAME: SEQ_T1
MIN_VALUE: 1
MAX_VALUE: 9999999999999999999999999999
INCREMENT_BY: 1
CYCLE_FLAG: N
ORDER_FLAG: N
CACHE_SIZE: 50
LAST_NUMBER: 10100
1 row in set (0.00 sec)
obclient>
DBA_SEQUENCESビューのフィールドおよび説明の詳細については、DBA_SEQUENCESを参照してください。
ALL_SEQUENCESビューのフィールドおよび説明の詳細については、ALL_SEQUENCESを参照してください。
USER_SEQUENCESビューのフィールドおよび説明の詳細については、USER_SEQUENCESを参照してください。
シーケンスの変更
シーケンス作成後、ALTER SEQUENCE ステートメントを使用してシーケンスのプロパティを変更できます。
OceanBaseデータベースでは、シーケンスの開始値、最小値、最大値、ステップサイズ、および繰り返し属性を変更できます。シーケンスを変更するSQL構文は以下のとおりです:
ALTER SEQUENCE sequence_name
{
[RESTART]
|[START WITH int_value]
|[ MINVALUE value | NOMINVALUE ]
|[ MAXVALUE value | NOMAXVALUE ]
|[ INCREMENT BY value ]
|[ CACHE value | NOCACHE ]
|[ ORDER | NOORDER ]
|[ CYCLE | NOCYCLE]
};
ALTER SEQUENCE ステートメントの詳細については、ALTER SEQUENCEを参照してください。
例:
シーケンス
seq2の最大値を変更し、自動増分で繰り返し生成するように指定します。obclient> ALTER SEQUENCE seq2 MAXVALUE 1024 CYCLE;シーケンスの開始値を変更します。
INCREMENT BYの値が0より大きい場合、シーケンスをリセットしてMINVALUEから値を取得させることができます。INCREMENT BYの値が0より小さい場合、シーケンスをリセットしてMAXVALUEから値を取得させることができます。ステートメントは以下のとおりです:obclient> ALTER SEQUENCE seq3 RESTART; Query OK, 0 rows affectedシーケンスをリセットし、
3から値を取得させるように設定します。ステートメントは以下のとおりです:obclient> ALTER SEQUENCE seq4 RESTART START WITH 3; Query OK, 0 rows affected
シーケンスの開始値を変更する際、
RESTARTは必ずしもシーケンス名の後に来る必要はありません。ステートメント内の任意の位置に配置できます。例:obclient> ALTER SEQUENCE seq4 START WITH 3 RESTART MINVALUE -100 CYCLE; Query OK, 0 rows affected
シーケンスの削除
DROP SEQUENCE ステートメントを使用してシーケンスを削除できます。構文は以下のとおりです:
DROP SEQUENCE sequence_name;
DROP SEQUENCE ステートメントの詳細については、DROP SEQUENCEを参照してください。
例:シーケンスS1を削除します。
obclient> DROP SEQUENCE S1;
Query OK, 0 rows affected
シーケンスキャッシュのクリア
他のシーケンスキャッシュの期限切れ問題を防ぐため、OceanBaseデータベースはV4.4.1バージョンから ALTER SYSTEM FLUSH SEQUENCE CACHE ステートメントを導入しました。これにより、問題発生時に迅速に復旧できるよう、シーケンスキャッシュを手動でクリアすることが可能です。構文は以下のとおりです:
ALTER SYSTEM FLUSH SEQUENCE CACHE
SEQUENCE_NAME = sequence_name
[GLOBAL];
シーケンスキャッシュクリアステートメントの詳細については、ALTER SYSTEM FLUSH SEQUENCE CACHEを参照してください。
例:
現在のテナントおよびデータベース内で、ノード上の test_seq1 という名前のシーケンスのキャッシュをクリアします。
obclient> ALTER SYSTEM FLUSH SEQUENCE CACHE
SEQUENCE_NAME = test_seq1;