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

Rad
fonte
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.

araqnid
fonte
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;

snider matt
fonte
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;
Loolooii
fonte
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    | 
Clodoaldo Neto
fonte
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

Wiwwil
fonte
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;
Anwar
fonte
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.
Chaudhary
fonte
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>;
BrianB
fonte
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;
Vinoth Shankar
fonte
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
Raja A
fonte
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).

Thushara Buddhika
fonte
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

abby
fonte