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 / 174439
Accepted
BrunoLM
BrunoLM
Asked: 2017-05-25 05:31:00 +0800 CST2017-05-25 05:31:00 +0800 CST 2017-05-25 05:31:00 +0800 CST

Como posso atualizar várias tabelas de uma só vez no Postgres?

  • 772

Tenho várias tabelas com exatamente a mesma estrutura e preciso atualizar um valor em todas as tabelas.

Para isso, tentei construir o seguinte script:

DO
$do$
DECLARE
  i pg_tables%rowtype;
BEGIN
FOR i IN SELECT * FROM pg_catalog.pg_tables where schemaname like 'public' and tablename like '%_knex_migrations'
LOOP
    UPDATE i.tablename SET name = replace(name, '.js', '.ts');
END LOOP;
END
$do$;

Pude ver que i.tablenametem o valor correto (inseri em uma tabela tmp para verificar), mas a atualização falha.

name: error
length: 223
severity: ERROR
code: 42P01
internalPosition: 8
internalQuery: UPDATE i."tablename" SET name = replace(name, '.js', '.ts')
where: PL/pgSQL function inline_code_block line 7 at SQL statement
file: parse_relation.c
line: 965
routine: parserOpenTable

Apenas plugin i.tablenamena UPDATEdeclaração não funciona.

Existe uma maneira de fazê-lo funcionar? Ou uma maneira mais fácil de atualizar todas as tabelas de uma só vez?

postgresql update
  • 2 2 respostas
  • 13401 Views

2 respostas

  • Voted
  1. Best Answer
    Evan Carroll
    2017-05-25T19:00:43+08:002017-05-25T19:00:43+08:00

    Você está realmente perto .. primeiro crie alguns dados de teste ..

    CREATE TABLE foo_knex_migrations ( name )
      AS VALUES ('test.js'),('test2.js'),('bicycles');
    CREATE TABLE bar_knex_migrations AS TABLE foo_knex_migrations;
    CREATE TABLE baz_knex_migrations AS TABLE foo_knex_migrations;
    

    Em seguida, vamos usar EXECUTE...FORMAT(), com %I.

    DO
    $do$
      DECLARE
        i pg_tables%rowtype;
      BEGIN
      FOR i IN SELECT * FROM pg_catalog.pg_tables where schemaname like 'public' and tablename like '%_knex_migrations'
      LOOP
        EXECUTE FORMAT(
          $$
            UPDATE %I
            SET name = replace(name, '.js', '.ts');
          $$,
          i.tablename
        );
      END LOOP;
      END
    $do$;
    
    
    TABLE baz_knex_migrations ;
       name   
    ----------
     test.ts
     test2.ts
     bicycles
    (3 rows)
    
    test=# TABLE foo_knex_migrations ;
       name   
    ----------
     test.ts
     test2.ts
     bicycles
    (3 rows)
    

    Como uma nota rodapé,

    1. Em geral, você deve usar o information_schemaque é padronizado para coisas simples como essa e onde a velocidade não importa.
    2. Você provavelmente deve estar verificando se UPDATEprecisa ser executado adicionando uma WHEREcláusula. Caso contrário, você está reescrevendo a tabela por nada.
    3. Em SQL, não usamos convenções de nomenclatura como esta. Não há necessidade disso. Se knex_migrationstiver várias tabelas, considere CREATE SCHEMA knex_migrationsarmazená-las, em vez de navegar pelo catálogo com base em uma convenção de nomenclatura para todas as tabelas.
    • 6
  2. Erwin Brandstetter
    2017-05-25T18:58:42+08:002017-05-25T18:58:42+08:00

    Você postou uma solução basicamente funcional como comentário.

    No entanto, um ponto fraco permanece: se você não qualificar o nome da tabela no UPDATEesquema e o esquema não for o primeiro no caminho de pesquisa atual, as tabelas erradas poderão ser atualizadas. Considere em vez disso:

    DO
    $do$
    DECLARE
       sch text := 'public';  -- your schema here
       tbl text;
    BEGIN
       FOR tbl IN
          SELECT tablename FROM pg_catalog.pg_tables
          WHERE  schemaname = sch
          AND    tablename LIKE '%_knex_migrations'
       LOOP
          EXECUTE format($$UPDATE %I.%I SET name = replace(name, '.js', '.ts')$$, sch, tbl); 
       END LOOP;
    END
    $do$;
    

    Relacionado:

    • Como o search_path influencia a resolução do identificador e o “esquema atual”
    • Nome da tabela como parâmetro de função do PostgreSQL
    • 2

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