Comecei a escrever este post como uma dúvida mas, ao reproduzir o erro, encontrei a solução na documentação do PostgreSQL. Então vou compartilhar a solução aqui para a comunidade.
Uma tabela PostgreSQL 14 teve alguns dados excluídos acidentalmente.
-- Creating table
CREATE TABLE my_table (
id integer not null primary key generated always as identity,
description varchar(50) not null
);
-- Filling data
INSERT INTO my_table (description)
VALUES
('Option A'), ('Option B'), ('Option C'), ('Option D'), ('Option E'),
('Option F'), ('Option G'), ('Option H'), ('Option I'), ('Option J');
SELECT * FROM my_table;
id | description
----+------------
1 | Option A
2 | Option B
3 | Option C
4 | Option D
5 | Option E
6 | Option F
7 | Option G
8 | Option H
9 | Option I
10 | Option J
Exclusão acidental:
DELETE FROM my_table WHERE id IN (6,7,8);
SELECT * FROM my_table;
id | description
----+------------
1 | Option A
2 | Option B
3 | Option C
4 | Option D
5 | Option E
9 | Option I
10 | Option J
Para reinserir essas linhas na tabela, tentei executar a seguinte instrução, definindo explicitamente valores para a coluna "id", mas gerou uma exceção:
INSERT INTO my_table (id, description)
VALUES
(6, 'Option F'), (7, 'Option G'), (8, 'Option H');
[428C9] ERROR: cannot insert a non-DEFAULT value into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS. Hint: Use OVERRIDING SYSTEM VALUE to override.
Felizmente, as mensagens de erro do PostgreSQL são bastante úteis.
Seguindo a dica mostrada pelo motor PostgreSQl, adicionei a instrução "OVERRIDING SYSTEM VALUE" e funcionou perfeitamente:
Espero que isso possa ser útil para qualquer um de vocês que enfrenta o mesmo problema que eu.
Saúde!
Você recebe o erro porque a coluna é criada com "GENERATED ALWAYS".
Se você usar "GERADO POR PADRÃO", poderá inserir valores na coluna e, neste caso, eles não serão gerados.