重命名 PostgreSQL 中具有特定列名的所有表中的所有列?

Rename all columns from all tables with specific column name in PostgreSQL?

有没有一种方法可以将我的 PostgreSQL 数据库中所有模式中名为 'location' 的所有列名称重命名为 'location_name'?

我是 SQL 的新手,我知道有一个 ALTER TABLE 命令,但不知道是否可以以某种方式遍历所有表?

您可以使用

获取数据库中的所有 location
SELECT * FROM information_schema.columns WHERE column_name = 'location';

然后可能使用某种编程语言来执行所有重命名查询。几乎每个数据库管理系统中都有 information_schema 个表(尽管有时它们 called/structured 不同)。

我想你最接近的是运行宁这样的东西:

SELECT FORMAT(
  'ALTER TABLE %I.%I.%I RENAME COLUMN %I TO %I;',
  catalog_name,
  schema_name,
  table_name,
  column_name,
  'location_name'
)
FROM information_schema.columns
WHERE column_name = 'location';

如果你 运行 在 psql 中,你可以用 \gexec 跟随它,它应该可以工作。

如果您有超级用户权限,您可以在系统目录中一次性完成更改:

UPDATE pg_attribute
SET attname = 'location_name'
WHERE attname = 'location';

您需要动态 SQL 为此使用匿名 PL/pgSQL 块以自动方式执行此操作:

do
$$
declare
  l_rec record;
begin
  for l_rec in (select table_schema, table_name, column_name 
                from information_schema.columns 
                where table_schema = 'public' 
                  and column_name = 'location') loop
     execute format ('alter table %I.%I rename column %I to %I_name', l_rec.table_schema, l_rec.table_name, l_rec.column_name, l_rec.column_name);
  end loop;
end;
$$

如果您有多个架构或您的表不在 public 架构中,请将条件 where table_schema = 'public' 替换为适当的限制。