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 / 324324
Accepted
showkey
showkey
Asked: 2023-03-03 16:29:31 +0800 CST2023-03-03 16:29:31 +0800 CST 2023-03-03 16:29:31 +0800 CST

Como posso adicionar uma coluna de tabela na primeira posição?

  • 772

No meu banco de dados PostgreSQL:

select index from sample;
index
---------
1
2
3
1
2

Eu quero colocar o indexseguinte:

select index from sample;
index
---------
1
2
3
4
5

Saddam Khan forneceu uma maneira de resolvê-lo:

alter table sample add column sort_id serial;
-- Drop column index from sample table.
alter table sample drop column index;
-- Rename column sort_id to index in sample table
alter table sample rename column sort_id to index;
-- Add Primary Key.
alter table sample add primary key(index);

Mas agora, a indexcoluna está do lado direito (final da tabela). Como posso colocá-lo no lado esquerdo?

 select * from sample;
 ticker |   roe   | income  | index 
--------+---------+---------+-------
 000820 | 2347.63 |  120.16 |     1
 300071 |  676.52 | 1035.38 |     2
 002188 |  289.69 |  273.95 |     3
 600734 |  151.58 |  921.82 |     4
 000523 |  139.94 | 2585.55 |     5
 600078 |  138.28 | 3333.41 |     6
postgresql
  • 3 3 respostas
  • 42 Views

3 respostas

  • Voted
  1. Phill W.
    2023-03-03T19:27:25+08:002023-03-03T19:27:25+08:00

    Adicionar chave primária...

    Os campos de chave primária devem ser exclusivos, não sequenciais. Se você tiver algum tipo de processamento que dependa de algo ser "pedido", não conte com a Chave Primária para fornecê-lo.

    Você pode imaginar o caos se o seu banco renumerasse as contas correntes das pessoas toda vez que alguém fechasse a conta? É uma ideia muito, muito ruim. Além disso, assim que você tiver chaves estrangeiras referenciando essas chaves primárias, o banco de dados realmente deve impedir que você faça isso (e não; alterações em "cascata" não são a resposta. A quantidade de trabalho que o banco de dados precisa fazer para fazer essas alterações cresce exponencialmente com cada nova tabela de referência e todas as linhas nelas).

    a coluna do índice está no lado direito...

    Por que você acha que isso importa?
    Cada instrução SELECT que você escreve deve especificar as colunas que deseja, na ordem em que deseja. Nunca confie no layout da tabela física porque, como você descobriu, ele pode mudar .

    Bancos de dados são entidades inerentemente compartilhadas e você nunca sabe quem [mais] fará o quê neles (ou para eles).

    • 2
  2. Best Answer
    a_horse_with_no_name
    2023-03-05T18:35:55+08:002023-03-05T18:35:55+08:00

    Você pode alterar a coluna para uma identitycoluna e atualizar os valores com base na sequência subjacente.

    -- required for an identity column
    alter table sample
        alter column "index" set not null;
    
    -- add the identity attribute - recommended over the proprietary "serial"
    alter table sample
        alter column "index" add generated by default as identity;
    

    Agora foi gerada uma sequência que pode ser usada para atualizar os valores existentes para torná-los únicos:

    update sample
       set "index" = nextval(pg_get_serial_sequence('sample', 'index'));
    

    Em seguida, torne a coluna a chave primária:

    alter table sample add primary key ("index");
    
    • 1
  3. Erwin Brandstetter
    2023-03-04T12:13:05+08:002023-03-04T12:13:05+08:00

    Novas colunas são adicionadas ao final da lista de colunas com ALTER TABLE. Você precisa recriar a tabela para obter a ordem desejada das colunas.
    Ou UPDATE a coluna existente no local, o que é um pouco complicado na presença de uma restrição UNIQUEou PRIMARY KEY(enquanto possível).

    Ambos são caros (para grandes mesas) e bloqueados. A primeira opção pode ser ainda mais barata no geral, embora mais invasiva. Normalmente, um problema para bancos de dados com acesso simultâneo. Não é um problema se você for o único usuário.

    Se você for escrever uma nova tabela, faça isso em vez de tudo o que está mostrando acima.

    Quaisquer referências internas à tabela antiga devem ser eliminadas e recriadas. Como chaves estrangeiras, visualizações etc.

    ALTER TABLE sample RENAME TO sample_old;
    
    -- drop all indexes and constraints on old table to free up names
    -- drop all referencing objects
    
    CREATE TABLE sample (
      index integer GENERATED ALWAYS AS IDENTITY
    , ticker text  -- use your actual data types
    , roe numeric
    , income numeric
    );
    
    INSERT INTO sample
          (ticker, roe, income)
    SELECT ticker, roe, income
    FROM   sample_old
    -- no ORDER BY ??
    ;
    
    ALTER TABLE sample ADD PRIMARY KEY (index);
    
    -- recreate all indexes and constraints on new table
    -- recreate all referencing objects
    
    DROP TABLE sample_old;  -- after making sure
    

    A nova IDENTITYcoluna é preenchida com números incrementados automaticamente a partir de seu anexo SEQUENCEautomaticamente, se não for direcionado na INSERTinstrução. Ver:

    • Coluna da tabela de incremento automático
    • 0

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