この記事では、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はパフォーマンス向上のために一部のシーケンス値をキャッシュするために使用され、高い同時実行性が必要な場合に使用します。説明
分散システムでシーケンスを使用する場合、
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