Eu tenho uma tabela na qual uma coluna é o número de sequência de incremento automático. Eu quero que o mesmo valor seja armazenado em outra coluna também (para que possa ser alterado posteriormente).
A estrutura da minha tabela está assim:
CREATE TABLE Test
(
test_id integer NOT NULL DEFAULT nextval('test_id_seq'::regclass),
...
...
uid integer not null DEFAULT currval('test_id_seq'::regclass),
)
Eu quero, uid = test_id
mas o problema é quando várias linhas são inseridas em uma sessão. Então currval
não pega o id correto.
Eu não quero usar um gatilho. Como posso gerenciá-lo?
Para não depender de nada
currval
, você pode transformar as consultas INSERT de maneira sistemática seguindo este padrão:Para inserir a partir de um select, em vez de:
INSERT INTO Test(colunas) SELECT colunas FROM...;
considere este formulário:
Para uma única linha em uma
VALUES
cláusula, em vez deconsiderar:
para cláusulas VALUES com várias linhas, em vez de:
considerar:
Se o PostgreSQL tivesse um NEXTVAL compatível com o padrão, você poderia fazer sem a subconsulta e apenas usar algo como:
e
NEXT VALUE FOR seqname
avaliaria o mesmo valor para ambas as colunas da mesma linha de saída, conforme exigido pelo padrão. Mas o PostgreSQL não possui essa construção.