Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Sequence Engine

Última atualização: Jul 09, 2026

O AliSQL oferece o Sequence Engine para simplificar a 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ó, identificadores globalmente únicos em sistemas distribuídos ou controle de idempotência entre vários sistemas. Cada sistema de banco de dados adota métodos de implementação diferentes. O MySQL, por exemplo, fornece o atributo AUTO_INCREMENT, enquanto Oracle e SQL Server disponibilizam objetos SEQUENCE.

Em bancos de dados MySQL, o uso de AUTO_INCREMENT pode ser inconveniente quando é necessário encapsular um valor único com informações adicionais, como data ou ID de usuário. Na prática, utilizam-se diferentes alternativas:

  • Gerar valores de sequência a partir de uma aplicação ou proxy. No entanto, manter estado na aplicação complica o dimensionamento horizontal (scale out e scale in).

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

O Sequence Engine foi projetado para oferecer a maior compatibilidade possível com os métodos utilizados por outros bancos de dados.

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

O Sequence Engine acessa objetos Sequence pela interface Sequence Handler para gerenciar o avanço de NEXTVAL e o cache. Em seguida, 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 tem suporte em instâncias do RDS Enterprise Edition.

Limitações

  • Sequências não têm suporte a subconsultas ou junções.

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

  • Não especifique o mecanismo Sequence ao criar uma tabela. Crie tabelas de sequência apenas com a sintaxe descrita em Criar uma sequência.

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

Valor inicial da sequência.

MINVALUE

Valor mínimo da sequência.

MAXVALUE

Valor máximo da sequência.

Nota

Se você especificar NOCYCLE, o seguinte erro será retornado ao atingir o valor máximo:

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

INCREMENT BY

Intervalo entre valores consecutivos da sequência.

CACHE/NOCACHE

Tamanho do cache. Para melhor desempenho, defina um tamanho de cache maior. Contudo, se a instância for reiniciada, os valores não utilizados no cache serão perdidos.

CYCLE/NOCYCLE

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

  • CYCLE: Permite o reinício da sequência.

  • NOCYCLE: Impede o reinício da sequência.

Exemplo:

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

Para garantir compatibilidade com backups criados via mysqldump, também é possível criar uma sequência definindo uma tabela de sequência e inserindo 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. Execute o comando SHOW CREATE TABLE para visualizar sua definição. 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 têm suporte às 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;