Fórum Preencher Lacuna (GAP) em coluna de tabela PostgreSQL #593106
11/05/2018
0
Por exemplo:
.
id | nome
--------
3 | Maria
5 | Beatriz
9 | Helena
.
ao incluir novos registros, os próximos IDs deveriam ser
1,2,4,6,7,8,10...
Já vi alguns exemplos na internet mas todos são falhos
Alguém tem ideia de como fazer isso funcionar?
Alberto
Curtir tópico
+ 0Post mais votado
11/05/2018
--DROP FUNCTION fnc_int_intervalo(VARCHAR, VARCHAR);
CREATE OR REPLACE FUNCTION fnc_int_intervalo(tabela VARCHAR, campo VARCHAR)
RETURNS integer AS
$BODY$
DECLARE
intRetorno INTEGER DEFAULT 0;
curSQL REFCURSOR;
recSQL RECORD;
BEGIN
OPEN curSQL FOR EXECUTE ''SELECT COALESCE(''|| Campo ||'',0) AS int_cod_atual FROM ''|| Tabela || '' ORDER BY ''|| Campo;
LOOP
FETCH curSQL INTO recSQL;
intRetorno = intRetorno + 1;
IF (intRetorno <> recSQL.int_cod_atual) OR (recSQL.int_cod_atual IS NULL) THEN
RETURN intRetorno;
CLOSE curSQL;
EXIT;
END IF;
END LOOP;
CLOSE curSQL;
RETURN intRetorno;
END;
$BODY$
LANGUAGE ''plpgsql'' VOLATILE
Jair N.
Gostei + 2
Mais Posts
11/05/2018
Alberto
"varre" a tabela, procurando pela lacuna, o que, em tabelas
com pouco registros nao faz diferença, mas se existir uma tabela
com 1 milhao de registros e nao existir nenhuma lacuna, a funcao
vai ficar num loop de 1 milhao, ate retornar.
.
Eu estava procurando algo mais viável,
como um select mais restrito, com resposta rápida.
.
Mas, mesmo assim, obrigado pela cooperaçao.
Gostei + 0
13/05/2018
Alberto
No caso da tabela abaixo, que é resultado de uma query, temos a coluna "row"
que é o sequencial gerado pela query.
.
row | id | nome
-----------------
1 | 3 | Maria
2 | 5 | Beatriz
3 | 9 | Helena
.
O que pensei foi simplesmente comparar a coluna row com a coluna id
retornando o primeiro registro que não coincidir os numeros,
que no exemplo acima retornaria 1, depois 2, depois 4...
.
ou seja, parece uma soluçao bem simples para o problema,
porém se alguém ver alguma falha, favor comentar,
segue o codigo abaixo:
Select a.row from
(SELECT row_number() OVER (PARTITION by 0) as row, campo_id as id FROM tabela) a
where a.row <> a.id limit 1
Gostei + 0
13/05/2018
Alberto
Select a.row from
(SELECT row_number() OVER (PARTITION by 0) as row, campo_id as id FROM tabela order by campo_id) a
where a.row <> a.id limit 1Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)