Redefinir contador de incremento automático no postgres


232

Gostaria de forçar o campo de incremento automático de uma tabela para algum valor, tentei com isso:

ALTER TABLE product AUTO_INCREMENT = 1453

E

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

Eu sou novo no postgres :(

Eu tenho uma mesa productcom Ide namecampo


5
Se novo, por que não usar o pgAdmin e inspecionar os comandos que ele irá gerar?
razoável,

1
Normalmente mesas são nomeadas como 'produtos" e não como um 'produto products_id_seq 'Tenha certeza que você está procurando uma sequência correta' Neste caso, a seqüência será nomeado como.'..
Alexander Gorg

Respostas:


309

Se você criou a tabela productcom uma idcoluna, a sequência não é simplesmente chamada product, mas sim product_id_seq(ou seja, ${table}_${column}_seq).

Este é o ALTER SEQUENCEcomando que você precisa:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Você pode ver as seqüências no seu banco de dados usando o \dscomando psql. Se você fizer \d producte observar a restrição padrão para sua coluna, a nextval(...)chamada também especificará o nome da sequência.


66
Não está claro nesta mensagem qual é a sintaxe correta. É: ALTER SEQUENCE product_id_seq REINICIE COM 1453;
Liron Yahdav

7
Só porque eu analisei o item acima mal, aqui está a minha maneira de reafirmar exatamente a mesma coisa. A sintaxe é ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #onde "seq" é o texto literal e você coloca um número para #. Não negligencie os sublinhados. :-)
kmort

2
Observe que, se não estiver usando o esquema público, é necessário prefixar my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. Vandenbosch

Alguém sabe por que ALTER SEQUENCE product_id_seq RESTART WITH (SELECT MAX (id) do produto); Não funciona? A única maneira que encontrei é usar duas consultas separadas.
Chris Huang-Leaver

8
Observe que o valor com o qual você reinicia é o próximo valor que você deseja usar. Portanto, se você já possui um registro com id 1453, deveria RESTART WITH 1454.
hughes

144

Aqui está o comando que você está procurando, supondo que sua sequência para a tabela do produto seja product_id_seq:

ALTER SEQUENCE product_id_seq REINICIE COM 1453;


130

O comando a seguir faz isso automaticamente para você: Isso também excluirá todos os dados da tabela. Por isso tem cuidado.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Cuidado - o que irá apagar todos os seus dados, bem
kibibu

28
@Loolooii, apenas sinalizando; se alguém que não esteja familiarizado com o SQL estiver pesquisando aqui porque adicionou manualmente uma linha a uma tabela com um campo de incremento automático (por meio de um ORM, por exemplo), essa solução provavelmente não é o que eles esperam.
Kibibu # 9/13

1
A TABLEpalavra-chave é redundante. TRUNCATE someTable RESTART IDENTITY;basta.
user1

Alguma idéia de como eu faria isso com o CASCADE?
Ihossain

2
@ihossain você já tentou TRUNCATE someTable RESTART IDENTITY CASCADE;?
Vedran

55

Para definir o contador de sequência:

setval('product_id_seq', 1453);

Se você não souber o nome da sequência, use a pg_get_serial_sequencefunção:

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

Os parâmetros são o nome da tabela e o nome da coluna.

Ou basta emitir um \d productno psqlprompt:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

- Alterar o valor inicial da sequência

ALTER SEQUENCE project_id_seq RESTART 3000;

Mesmo mas dinâmico:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

Concordo que o uso de um SELECT é perturbador, mas funciona.

Fonte: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


Se não me engano, PG representa suas seqüências com last_value e is_called, começa em (1, false), então (1, true), (2, true) ... então o MAX (id) + 1 deve ser MAX (id) para não pular um ID.
Dez

Eu também tive que reiniciar minha instância do postgres para que isso funcionasse. brew services restart postgresql
BigRon 31/01

SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 do projeto)); Funciona perfeitamente Mas existe uma maneira de redefinir o valor do incremento para 0. Portanto, as novas entradas começam com um índice 0?
Charith Jayasanka

13

Convertido de comentário por uma questão de conveniência do visitante

Não está claro nesta mensagem qual é a sintaxe correta. Isto é:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

Se você deseja redefinir o incremento automático a partir da GUI, siga estas etapas.

  1. Vá para o seu banco de dados
  2. Clique em Público
  3. na página Listagem de tabelas, você pode ver TABS como 'Tabelas', 'Visualizações', 'Sequências' assim.
  4. Clique em Sequências
  5. Quando você clica em 'Sequências', pode ver toda a Lista de sequências, clique na que deseja redefinir
  6. Depois disso, você pode ver várias opções como 'Alterar', 'Definir valor', 'Reiniciar', 'Redefinir' etc ...
  7. depois clique em Redefinir e adicione uma nova linha.

6

Se você tiver uma tabela com uma coluna IDENTITY que deseja redefinir o próximo valor, poderá usar o seguinte comando:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
One + para usabilidade em caso de não existir sequenceou você NÃO pode truncar a tabela. Eu acho que é a melhor resposta
ABS

5

Para redefinir o incremento automático, é necessário obter o nome da sequência usando a seguinte consulta.

Sintaxe:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Exemplo:

SELECT pg_get_serial_sequence('demo', 'autoid');

A consulta retornará o nome da sequência de autoid como "Demo_autoid_seq". Em seguida, use a seguinte consulta para redefinir o autoid

Sintaxe:

ALTER SEQUENCE sequenceName RESTART WITH value;

Exemplo:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Para obter o ID da sequência, use

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

Isso fornecerá o ID do seque como tableName_ColumnName_seq

Para obter o último número de semente, use

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

ou se você souber o ID da sequência, use-o diretamente.

select currval(tableName_ColumnName_seq);

Isso lhe dará o último número de semente

Para redefinir o número da semente, use

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Use esta consulta para verificar o que é a chave de sequência com esquema e tabela,

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

Use esta consulta para aumentar o valor do incremento, um por um,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

Ao inserir na tabela, o próximo valor incrementado será usado como a chave (111).

Use esta consulta para definir um valor específico como o valor incrementado

SELECT setval('"SchemaName"."SequenceKey"', 120);

Ao inserir na tabela, o próximo valor incrementado será usado como chave (121).


0

Observe que se você tiver um nome de tabela com '_', ele será removido no nome da sequência.

Por exemplo, nome da tabela: coluna user_tokens: id Nome da sequência: usertokens_id_seq

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.