在PostgreSQL中重命名多个列

时间:2015-10-28 20:52:21

标签: sql postgresql automation sql-update ddl

我的表格有以下格式的一堆列:

<link type="text/css" href="assets/styles/main.css" rel="stylesheet">

我想重命名它们只是为了添加一个前缀,如下所示:

48. 2971215073
49. 4807526976
50. 7778742049
51. 12586269025
52. 20365011074
53. 32951280099
54. 53316291173
55. 86267571272
56. 139583862445
57. 225851433717
58. 365435296162
59. 591286729879
60. 956722026041

实现这一目标的最快捷/最有效的方法是什么?

编辑:我应该补充说,我有一个 lot 超过三列,以这种方式重命名。如果我只有三个,我会一个接一个地手动完成。并感谢你无论你是谁。

4 个答案:

答案 0 :(得分:4)

没有单一的命令方式。显然你可以为自己键入RENAME的多个命令,但让我引入一些改进:)正如我在this answer中所说的

  

...对于所有这样的批量管理操作,您可以使用PostgreSQL系统表为您生成查询,而不是手动编写它们

在你的情况下,它将是:

SELECT
    'ALTER TABLE ' || tab_name || ' RENAME COLUMN '
    || quote_ident(column_name) || ' TO '
    || quote_ident( '_1' || column_name) || ';'
FROM (
    SELECT
        quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name,
        column_name
    FROM information_schema.columns  
    WHERE 
            table_schema = 'schema_name'
            AND table_name = 'table_name'
            AND column_name LIKE '\_%'
) sub;

它将为您提供一组字符串,这些字符串是SQL命令,如:

ALTER TABLE  schema_name.table_name RENAME COLUMN "_settingA" TO "_1_settingA";
ALTER TABLE  schema_name.table_name RENAME COLUMN "_settingB" TO "_1_settingB";
...

如果您的表位于table_schema架构中,则无需在WHERE子句中使用public还记得使用函数quote_ident() - 请阅读我的原始答案以获得更多解释。

编辑:

我已更改了我的查询,因此现在它适用于名称以下划线_开头的所有列。因为下划线是SQL模式匹配中的特殊字符,所以我们必须将其转义(使用\)以便实际找到它。

答案 1 :(得分:0)

像这样简单的东西就可以了。

SELECT FORMAT(
  'ALTER TABLE %I.%I.%I RENAME %I TO %I;',
  table_catalog,
  table_schema,
  table_name,
  column_name,
  '_PREFIX_' + column_name
)
FROM information_schema.columns
WHERE table_name = 'foo';

%I会做quote_ident,这会非常好。如果您使用PSQL,则可以使用\gexec

运行它

答案 2 :(得分:0)

您可以使用以下功能: (我用它在表超过50列的表上添加前缀)

首先创建函数:

CREATE OR REPLACE FUNCTION rename_cols( schema_name_ text,table_name_ text, prefix varchar(4))
    RETURNS bool AS
     $BODY$
     DECLARE
       rec_selection record;
        BEGIN
          FOR rec_selection IN (
              SELECT column_name FROM information_schema.columns WHERE table_schema = schema_name_ AND table_name = table_name_) LOOP
            EXECUTE 'ALTER TABLE '||schema_name_||'.'||table_name_||' RENAME COLUMN "'|| rec_selection.column_name ||'" TO "'||prefix|| rec_selection.column_name ||'" ;';
          END LOOP;
        RETURN True;
       END;
     $BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100;

然后执行功能:

SELECT rename_cols('public','test','d');

希望它会有用,

答案 3 :(得分:-1)

你做不到。

RENAME SET SCHEMA 之外的所有操作都可以组合成多个更改列表,以便并行应用。

最有效的方法是使用ActiveRecord。