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.tablename
tem 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.tablename
na UPDATE
declaraçã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?
Você está realmente perto .. primeiro crie alguns dados de teste ..
Em seguida, vamos usar
EXECUTE...
FORMAT()
, com%I
.Como uma nota rodapé,
information_schema
que é padronizado para coisas simples como essa e onde a velocidade não importa.UPDATE
precisa ser executado adicionando umaWHERE
cláusula. Caso contrário, você está reescrevendo a tabela por nada.knex_migrations
tiver várias tabelas, considereCREATE SCHEMA knex_migrations
armazená-las, em vez de navegar pelo catálogo com base em uma convenção de nomenclatura para todas as tabelas.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
UPDATE
esquema e o esquema não for o primeiro no caminho de pesquisa atual, as tabelas erradas poderão ser atualizadas. Considere em vez disso:Relacionado: