Ao criar uma sequência no Postgres 10, como você incrementa automaticamente as atualizações? (Não apenas atribua o próximo número mais alto para a próxima linha inserida.)
Por exemplo, suponha que eu crie a seguinte tabela e sequência encontrada nesta página :
CREATE TABLE fruits(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
);
INSERT INTO fruits(name) VALUES('Orange');
INSERT INTO fruits(id,name) VALUES(DEFAULT,'Apple');
SELECT * FROM fruits;
id | name
----+--------
1 | Apple
2 | Orange
(2 rows)
Como você pode ver, ele incrementa automaticamente a coluna "id" em um em inserções. No entanto, se eu fizer uma atualização como:
update fruits
set name = 'Orange2'
where name = 'Orange';
SELECT * FROM fruits;
id | name
----+--------
1 | Apple
How do I get this to auto-increment to 3? --> 2 | Orange2
(2 rows)
Como você pode ver acima, a linha com id=2 não foi atualizada para id=3. Como crio uma sequência que será incrementada automaticamente nas atualizações?
É uma solicitação incomum, porque normalmente não se deseja alterar um ID serial existente. (O PK, nada menos!)
Mas para responder a pergunta: Use um gatilho .
Exemplo de função de gatilho e gatilho:
db<>fiddle aqui (para Postgres 10)
Obviamente, isso substitui quaisquer alterações na
id
coluna que possam ter sido feitas no mesmo arquivoUPDATE
.E não é exatamente "incremento automático". Ele atribui o próximo número livre do anexo
SEQUENCE
. Supondo que foi isso que você quis dizer.Observe a
WHEN
condição: o gatilho só é acionado quandoname
realmente muda. (Não gostaria de alterar o ID para outras atualizações, não é?) Relacionado:Você pode fazer a função de gatilho funcionar para qualquer tabela (com um
serial
namedid
) usando o nome da tabela de gatilho (com segurança!):Leia o manual sobre as funções do gatilho .
Relacionado:
Ou torne-o menos genérico e um pouco mais rápido codificando o nome do
SEQUENCE
:Você decide o que é seguro e apropriado em seu ambiente.
Mas seu
UPDATE
exemplo faz mais sentido com umaUNIQUE
restrição emfruits.name
:se você quiser atualizá-lo explicitamente, você pode usar a palavra-chave
DEFAULT
se você quiser atualizá-lo implicitamente, use um gatilho como na outra resposta.