我有几个结构完全相同的表,我需要更新所有表中的值。
为此,我尝试构建以下脚本:
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$;
我可以看到它i.tablename
具有正确的值(我插入了一个 tmp 表进行检查),但更新失败。
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
i.tablename
只是声明上的插件UPDATE
不起作用。
有没有办法让它工作?或者更简单的方法来一次更新所有表?
你实际上很接近..首先创建一些测试数据..
接下来,我们将使用
EXECUTE...
FORMAT()
, with%I
。作为旁注,
information_schema
标准化的东西来处理像这样的简单事情,而速度并不重要。UPDATE
需要运行。WHERE
否则,您将一劳永逸地重写表格。knex_migrations
有多个表,请考虑CREATE SCHEMA knex_migrations
存储它们,而不是根据所有表的命名约定来搜索目录。您发布了一个基本可行的解决方案作为评论。
但是,一个弱点仍然存在:如果您不对 中的表名进行模式限定,
UPDATE
并且该模式恰好不是当前搜索路径中的第一个,则可能会更新错误的表。改为考虑:有关的: