AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 78732
Accepted
zetah
zetah
Asked: 2014-10-09 18:42:14 +0800 CST2014-10-09 18:42:14 +0800 CST 2014-10-09 18:42:14 +0800 CST

Altere a coluna existente no PG para a chave primária de incremento automático

  • 772

Tenho um banco de dados em Postgresql, que foi migrado do SQL Server (somente dados).
No SQL Server, uma tabela desse banco de dados possui estas colunas:

measure_id
datum
measure

onde measure_idé chave primária auto-incremental, datumé datetime e measureé float.
Após migração no Postrgresql, measure_idé coluna do tipo bigint.

Como posso alterar essa coluna ( measure_id) para bigserial e atribuí-la como chave primária, agora que minha tabela está cheia de dados?

postgresql migration
  • 2 2 respostas
  • 44261 Views

2 respostas

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2014-10-09T22:00:38+08:002014-10-09T22:00:38+08:00

    Crie uma sequência e use-a como valor padrão para a coluna:

    create sequence measures_measure_id_seq
       owned by measures.measure_id;
    
    alter table measures
       alter column measure_id set default nextval('measures_measure_id_seq');
    
    commit;
    

    Isso essencialmente o que serialfaz.

    Consulte o manual para obter detalhes:
    http://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL


    A partir do Postgres 10, a maneira recomendada é usar colunas compatíveis com o padrão identity, em vez de serial (ou bigserial).

    alter table measures
       alter measure_id add generated always as identity;
    

    Em ambos os casos, você terá que ajustar a sequência para corresponder ao valor máximo atual na measure_idcoluna:

    select setval(pg_get_serial_sequence('measures', 'measure_id'), max(measure_id))
    from measures;
    
    • 24
  2. Masroor
    2022-02-10T02:15:00+08:002022-02-10T02:15:00+08:00

    Vejo que a questão já está marcada como resolvida, porém, conforme apontado nos comentários, está faltando o caso em que existem registros existentes que já possuem alguns valores definidos na coluna relevante.

    Vou listar alguns outros casos também.

    Estou fazendo isso para uma tabela chamada productsque está presente no publicesquema. O auto-incremento está sendo feito para a idcoluna desta tabela.

    1. Para uma coluna inexistente

    -- auto-increment constraint for a new column
     ALTER TABLE public.products
        ADD COLUMN id SERIAL PRIMARY KEY;
    

    2. Para uma coluna existente que não obteve valores na tabela

    -- create sequence
    CREATE SEQUENCE public_products_id_seq OWNED BY public.products.id;
    
    -- use sequence for the target column
    ALTER TABLE public.products ALTER COLUMN id SET DEFAULT nextval('public_products_id_seq');
    
    

    3. Para uma coluna existente que já possui alguns valores na tabela

    -- create sequence
    CREATE SEQUENCE public_products_id_seq OWNED BY public.products.id;
    
    -- set the current value of the sequence to the max value from that column
    -- (id column in this scenario)
    SELECT SETVAL('public_products_id_seq', (select max(id) from public.products), false)
    
    -- use sequence for the target column
    ALTER TABLE public.products ALTER COLUMN id SET DEFAULT nextval('public_products_id_seq');
    

    Referências de documentação para CREATE SEQUENCE e SETVAL

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve