【问题标题】:Rename all columns from all tables with specific column name in PostgreSQL?重命名PostgreSQL中具有特定列名的所有表中的所有列?
【发布时间】:2016-12-29 22:43:52
【问题描述】:

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

我对 SQL 很陌生,知道有一个 ALTER TABLE 命令,但不知道是否可以以某种方式遍历所有表?

【问题讨论】:

  • 总是有一个脚本可以从头开始重新创建数据库。编辑该脚本。

标签: sql postgresql postgresql-9.2


【解决方案1】:

您可以使用

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

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

【讨论】:

    【解决方案2】:

    我认为你会得到最接近的是运行这样的东西:

    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 跟随它,它应该可以工作。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 哇,这是个糟糕的主意。您不应该直接修改目录。
      【解决方案4】:

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

      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' 替换为适当的限制。

      【讨论】:

      • 感谢您的详细回复,Patrick 的回复我成功了,但我相信这也可以。
      • @Chris:搞乱系统目录确实不是一个好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 2014-11-04
      • 2020-12-17
      • 2020-08-30
      • 1970-01-01
      • 2014-04-26
      • 2020-05-27
      相关资源
      最近更新 更多