このセクションでは、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;