Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Sequence Engine

Última atualização: Oct 09, 2026

O AliSQL fornece o Sequence Engine para simplificar o processo de obtenção de valores de sequência.

Introdução

Sistemas de banco de dados persistentes frequentemente exigem um valor único monotonicamente crescente para casos de uso como chaves primárias de negócios em um único nó, um identificador globalmente único em um sistema distribuído ou controle de idempotência em vários sistemas. Diferentes sistemas de banco de dados oferecem métodos de implementação distintos. Por exemplo, o MySQL fornece o atributo AUTO_INCREMENT, enquanto o Oracle e o SQL Server fornecem objetos SEQUENCE.

Em bancos de dados MySQL, usar o AUTO_INCREMENT pode ser inconveniente se você precisar encapsular um valor único com informações adicionais, como uma data ou um ID de usuário. Na prática, diferentes alternativas são utilizadas:

  • Gerar valores de sequência a partir de uma aplicação ou proxy. Contudo, manter o estado na aplicação dificulta o dimensionamento para expansão e redução.

  • Gerar valores de sequência a partir de uma tabela simulada no banco de dados. Esse método exige um middleware para encapsular e simplificar a lógica de obtenção de valores únicos.

O Sequence Engine foi projetado para ser o mais compatível possível com os métodos utilizados por outros bancos de dados.

O Sequence Engine implementa a interface de mecanismo de armazenamento do MySQL, mas utiliza um mecanismo de armazenamento existente, como InnoDB ou MyISAM, para armazenar dados persistentes. Isso o torna compatível com ferramentas de terceiros, como o XtraBackup. Portanto, o Sequence Engine é um mecanismo lógico.

O Sequence Engine acessa objetos Sequence por meio da interface Sequence Handler para gerenciar o avanço de NEXTVAL e o gerenciamento de cache. Em seguida, ele encaminha as solicitações ao mecanismo de armazenamento da tabela base subjacente para o acesso final aos dados.

Pré-requisitos

Sua instância deve estar em uma das seguintes versões:

  • RDS for MySQL 8.4

  • RDS for MySQL 8.0 com versão secundária do mecanismo 20190816 ou posterior

  • RDS for MySQL 5.7 com versão secundária do mecanismo 20210430 ou posterior

  • RDS for MySQL 5.6 com versão secundária do mecanismo 20170901 ou posterior

Nota

Este recurso não é compatível com instâncias do RDS Enterprise Edition.

Limitações

  • As sequências não suportam subconsultas ou junções (joins).

  • Use SHOW CREATE TABLE para visualizar a estrutura de uma sequência.

  • Não é possível especificar o mecanismo Sequence ao criar uma tabela. Crie tabelas de sequência apenas usando a sintaxe Create a sequence.

Criar uma sequência

CREATE SEQUENCE [IF NOT EXISTS] <database_name>.<sequence_name>
   [START WITH <constant>]
   [MINVALUE <constant>]
   [MAXVALUE <constant>]
   [INCREMENT BY <constant>]
   [CACHE <constant> | NOCACHE]
   [CYCLE | NOCYCLE]
  ;
Nota

Os parâmetros entre colchetes ([]) são opcionais.

A tabela a seguir descreve os parâmetros.

Parâmetro

Descrição

START WITH

O valor inicial da sequência.

MINVALUE

O valor mínimo da sequência.

MAXVALUE

O valor máximo da sequência.

Nota

Caso especifique NOCYCLE, o seguinte erro será retornado quando o valor máximo for atingido:

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

INCREMENT BY

O intervalo entre valores consecutivos da sequência.

CACHE/NOCACHE

O tamanho do cache. Para melhorar o desempenho, defina um tamanho de cache grande. No entanto, se a instância for reiniciada, os valores não utilizados no cache serão perdidos.

CYCLE/NOCYCLE

Define se a sequência pode ser reiniciada a partir de MINVALUE após ser esgotada. Valores válidos:

  • CYCLE: Permite que a sequência seja reiniciada.

  • NOCYCLE: Não permite que a sequência seja reiniciada.

Exemplo:

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

Para garantir a compatibilidade com backups gerados pelo mysqldump, crie uma sequência a partir de uma tabela de sequência e insira um registro inicial. Exemplo:

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;

Definição da tabela de sequência

Uma sequência é armazenada em uma tabela. Para visualizar sua definição, execute o comando SHOW CREATE TABLE. Exemplo:

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

Sintaxe de consulta

As sequências suportam as seguintes sintaxes de consulta:

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

    Nota

    Aplicável ao RDS for MySQL 8.4, 8.0 e 5.7.

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

    Nota

    Aplicável ao RDS for MySQL 8.4, 8.0, 5.7 e 5.6.

Exemplo:

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

Para uma sequência recém-criada, chame NEXTVAL uma vez para inicializá-la antes de consultá-la. Caso contrário, o erro Sequence 'xxx' is not yet defined in current session será retornado.

Exemplo de chamada de NEXTVAL:

SELECT <sequence_name>.nextval FROM dual;