在postgres中将表列名更改为大写

时间:2013-01-16 05:08:24

标签: postgresql postgresql-9.2

我正在使用postgres 9.2。 我需要将postgres db中的所有表的所有列名更改为UPPER CASE。

有没有办法做到这一点? 我是否需要更改postgres中的任何配置?

3 个答案:

答案 0 :(得分:33)

在我解释如何做到这一点之前,我会强烈建议不这样做。

在PostgreSQL中,如果表名或列​​名不加引号,例如:

SELECT Name FROM MyTable WHERE ID = 10

他们实际上首先自动折叠为小写,因此上面的查询与以下内容相同:

SELECT name FROM mytable WHERE id = 10

如果您要将所有名称转换为大写,则此语句将无效

SELECT NAME FROM MYTABLE WHERE ID = 10

您必须在此查询中对每个名称进行双引号才能使其正常工作:

SELECT "NAME" FROM "MYTABLE" WHERE "ID" = 10

另一方面,如果您使用标准的PostgreSQL小写协议,则可以使用任何案例组合,只要您不引用任何名称,它就会起作用。


现在,如果您仍坚持转换为大写,则可以使用pg_dump --schema-only将数据库架构转储到文件中。

完成后,检查所有CREATE TABLE语句并根据此转储构造适当的ALTER TABLE语句 - 您必须编写一些脚本(Perl或Python)来执行此操作。

或者,您可以阅读INFORMATION_SCHEMA.TABLES和/或INFORMATION_SCHEMA.COLUMNS,还可以构建和执行相应的ALTER TABLE语句。

答案 1 :(得分:0)

在查询下面创建SQL语句,您可以运行这些语句以将表的列名更改为小写。删除table_name检查是否要广泛应用。有关更多详细信息,请参见this post

SELECT array_to_string(ARRAY(SELECT 'ALTER TABLE ' || quote_ident(c.table_schema) || '.'
  || quote_ident(c.table_name) || ' RENAME "' || c.column_name || '" TO ' || quote_ident(lower(c.column_name)) || ';'
  FROM information_schema.columns As c
  WHERE c.table_schema NOT IN('information_schema', 'pg_catalog') 
      AND c.column_name <> lower(c.column_name) 
      and table_name = 'your_table_name'
  ORDER BY c.table_schema, c.table_name, c.column_name
  ) , 
   E'\r') As ddlsql;

答案 2 :(得分:0)

此查询必须有效

  Alter table if exists tablename rename to "TABLENAME"