All Products
Search
Document Center

ApsaraDB RDS:Sequence Engine

Last Updated:May 13, 2026

AliSQL menyediakan Sequence Engine untuk menyederhanakan proses pengambilan nilai sequence.

Pendahuluan

Sistem database persisten sering memerlukan nilai unik yang meningkat secara monoton untuk berbagai kasus penggunaan, seperti kunci utama bisnis pada node tunggal, pengidentifikasi unik global dalam sistem terdistribusi, atau kontrol idempotensi di berbagai sistem. Sistem database yang berbeda menyediakan metode implementasi yang berbeda pula. Sebagai contoh, MySQL menyediakan atribut AUTO_INCREMENT, sedangkan Oracle dan SQL Server menyediakan objek SEQUENCE.

Pada database MySQL, penggunaan AUTO_INCREMENT bisa menjadi tidak praktis jika Anda ingin mengenkapsulasi nilai unik dengan informasi tambahan, seperti tanggal atau ID pengguna. Dalam praktiknya, solusi alternatif berikut umum digunakan:

  • Menghasilkan nilai sequence dari aplikasi atau proxy. Namun, mempertahankan state di sisi aplikasi mempersulit proses scaling out dan scaling in.

  • Menghasilkan nilai sequence dari tabel simulasi di dalam database. Metode ini memerlukan middleware untuk mengenkapsulasi dan menyederhanakan logika pengambilan nilai unik.

Sequence Engine dirancang agar sekompatibel mungkin dengan metode yang digunakan oleh database lain.

Sequence Engine mengimplementasikan antarmuka storage engine MySQL, tetapi menggunakan storage engine yang sudah ada—seperti InnoDB atau MyISAM—untuk menyimpan data persisten. Hal ini menjadikannya kompatibel dengan alat pihak ketiga seperti XtraBackup, sehingga Sequence Engine merupakan engine logis.

Sequence Engine mengakses objek Sequence melalui antarmuka Sequence Handler untuk mengelola peningkatan NEXTVAL dan manajemen cache. Permintaan tersebut kemudian diteruskan ke storage engine tabel dasar untuk akses data akhir.

Prasyarat

Instans Anda harus menggunakan salah satu versi berikut:

  • RDS for MySQL 8.4

  • RDS for MySQL 8.0 dengan versi mesin minor 20190816 atau lebih baru

  • RDS for MySQL 5.7 dengan versi mesin minor 20210430 atau lebih baru

  • RDS for MySQL 5.6 dengan versi mesin minor 20170901 atau lebih baru

Catatan

Fitur ini tidak didukung pada instans RDS Enterprise Edition.

Batasan

  • Sequence tidak mendukung subquery atau join.

  • Anda dapat menggunakan SHOW CREATE TABLE untuk melihat struktur sequence.

  • Anda tidak dapat menentukan engine Sequence saat membuat tabel. Tabel sequence hanya dapat dibuat menggunakan sintaksis Create a sequence.

Create a 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]
  ;
Catatan

Parameter dalam tanda kurung siku ([]) bersifat opsional.

Tabel berikut menjelaskan parameter-parameter tersebut.

Parameter

Deskripsi

START WITH

Nilai awal sequence.

MINVALUE

Nilai minimum sequence.

MAXVALUE

Nilai maksimum sequence.

Catatan

Jika Anda menentukan NOCYCLE, error berikut akan dikembalikan saat nilai maksimum tercapai:

ERROR HY000: Sequence 'db.seq' has been run out.

INCREMENT BY

Langkah antara nilai sequence yang berurutan.

CACHE/NOCACHE

Ukuran cache. Untuk performa yang lebih baik, Anda dapat mengatur ukuran cache yang besar. Namun, jika instans restart, nilai yang belum digunakan dalam cache akan hilang.

CYCLE/NOCYCLE

Menentukan apakah sequence dapat dimulai ulang dari MINVALUE setelah habis. Nilai yang valid:

  • CYCLE: Mengizinkan sequence dimulai ulang.

  • NOCYCLE: Tidak mengizinkan sequence dimulai ulang.

Contoh:

create sequence s
       start with 1
       minvalue 1
       maxvalue 9999999
       increment by 1
       cache 20
       cycle;

Untuk memastikan kompatibilitas dengan backup yang dibuat menggunakan mysqldump, Anda juga dapat membuat sequence dengan membuat tabel sequence dan memasukkan catatan awal. Contoh:

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 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1;

INSERT INTO schema.sequence_name VALUES(0,0,1,9223372036854775807,1,1,10000,1,0);
COMMIT;

Sequence table definition

Sequence disimpan dalam sebuah tabel. Anda dapat melihat definisinya dengan menjalankan perintah SHOW CREATE TABLE. Contoh:

SHOW CREATE TABLE schema.sequence_name;

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 'already how many round'
) ENGINE=Sequence DEFAULT CHARSET=latin1

Query syntax

Sequence mendukung sintaksis kueri berikut:

  • SELECT nextval(<sequence_name>),currval(<sequence_name>) FROM <sequence_name>;

    Catatan

    Berlaku untuk RDS for MySQL 8.4, 8.0, dan 5.7.

  • SELECT <sequence_name>.currval, <sequence_name>.nextval FROM dual;

    Catatan

    Berlaku untuk RDS for MySQL 8.4, 8.0, 5.7, dan 5.6.

Contoh:

mysql> SELECT test.currval, test.nextval from dual;
+--------------+--------------+
| test.currval | test.nextval |
+--------------+--------------+
|           24 |           25 |
+--------------+--------------+
1 row in set (0.03 sec)
            
Catatan

Untuk sequence yang baru dibuat, Anda harus memanggil NEXTVAL sekali untuk menginisialisasinya sebelum dapat dilakukan kueri. Jika tidak, error Sequence 'xxx' is not yet defined in current session akan dikembalikan.

Contoh pemanggilan NEXTVAL:

SELECT <sequence_name>.nextval FROM dual;