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
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 TABLEpara 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]
;
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: |
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:
|
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>;NotaAplicável ao RDS for MySQL 8.4, 8.0 e 5.7.
-
SELECT <sequence_name>.currval, <sequence_name>.nextval FROM dual;NotaAplicá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)
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;