9

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

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

4

3 回答 3

44

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

在 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构造适当的语句 - 您必须编写一些脚本(Perl 或 Python)来执行此操作。ALTER TABLE

或者,您可以阅读INFORMATION_SCHEMA.TABLES和/或INFORMATION_SCHEMA.COLUMNS并构造和执行适当ALTER TABLE的语句。

于 2013-01-16T05:51:41.430 回答
3

下面的查询创建 SQL 语句,您可以运行这些语句将表的列名更改为小写。如果要广泛应用,请删除 table_name 检查。有关更多详细信息,请参阅此帖子

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;
于 2019-10-31T15:17:49.457 回答
-1

this query must work

  Alter table if exists tablename rename to "TABLENAME"
于 2021-03-30T06:04:05.503 回答