1
resposta

CREATE SEQUENCE POSTGRE

Gostaria de saber se é possível criar uma sequence no formato OS00001/01, OS00001/02 uma complementando a outra ou se poderia ser

OS0001, OS0002 ...

1 resposta

Oi, Guilherme! Tudo certo por aí?

Desde já, peço desculpas pela demora em te responder.

É possível sim — inclusive, as duas formas são admitidas! Para construir uma sequência personalizada, usaremos conhecimentos acerca de funções e triggers. Caso não tenha familiaridade nestes assuntos, não se preocupe, pois ambas estruturas são bastante comuns no dia a dia de uma pessoa que trabalha com banco de dados, sendo, portanto, um conhecimento que construímos ao longo do tempo.

De maneira geral, funções são recursos usados para guardar tarefas específicas que podem ser reutilizadas em consultas SQL ou outros contextos.

Por outro lado, as triggers (gatilhos) são procedimentos disparados em resposta a determinados eventos, como inserções, atualizações ou exclusões de registros.

Para uma melhor progressão de ideias, irei utilizar como exemplo o formato OS00001/01, vamos lá?

Inicialmente, iremos criar a seguinte tabela:

CREATE TABLE tabela1 (
    id VARCHAR(20) PRIMARY KEY,
    nome VARCHAR(100) NOT NULL
);

Guilherme, observe que o id (chave primária) possui o tipo de dado VARCHAR. Isso será importante para a modelagem dos valores!

Após isso, iremos criar uma nova sequência, que será iniciada pelo valor 1:

CREATE SEQUENCE id_sequencia START 1;

Agora, precisamos construir a função abaixo:

CREATE OR REPLACE FUNCTION adiciona_sequencia() RETURNS TRIGGER AS $$
    BEGIN
        NEW.id = 'OS00001/' || nextval('id_sequencia');
        RETURN NEW;
    END;
$$ LANGUAGE PLPGSQL;

Após definir que a função adiciona_sequencia deve ser criada ou atualizada (conforme o contexto), indicamos que ela retornará um trigger.

Além disso, em seu bloco lógico, afirmamos que, conforme novos registros forem sendo adicionados a nossa tabela, iremos atualizar o campo id pela concatenação de 'OS00001/' e nextval('id_sequencia'). Por meio do nextval, conseguimos pegar o próximo valor da sequência id_sequencia (a qual será a contagem 1, 2, 3...).

Por fim, iremos criar o trigger incrementa_id:

CREATE OR REPLACE TRIGGER incrementa_id
BEFORE INSERT
ON tabela1
FOR EACH ROW
EXECUTE FUNCTION adiciona_sequencia();

O objetivo desse trigger é executar a função adiciona_sequencia sempre que tentarmos inserir um novo dado à tabela. Ao utilizar a expressão BEFORE INSERT, indicamos que o gatilho será acionado antes da inserção propriamente dita, permitindo que o valor de id seja alterado antes de ser armazenado.

Agora é só adicionar alguns registros na tabela (com a cláusula INSERT) e observar o resultado obtido após um SELECT:

idnome
OS00001/1Registro A
OS00001/2Registro B
OS00001/3Registro C
OS00001/4Registro D
OS00001/5Registro E

Guilherme, para chegar ao formato OS0001, iremos apenas alterar o valor a ser atribuído ao campo id:

NEW.id = 'OS000' || nextval('id_sequencia');

Dessa forma, chegaremos no seguinte resultado após a inserção de novos dados:

idnome
OS0001Registro A
OS0002Registro B
OS0003Registro C
OS0004Registro D
OS0005Registro E

Espero ter ajudado! No entanto, vale ressaltar que como é um assunto externo ao curso e que não tenho acesso ao seu cenário, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema!

Fico à disposição em caso de dúvidas.

Um forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!