我正在使用postgres 9.2。 我需要将postgres db中的所有表的所有列名更改为UPPER CASE。
有没有办法做到这一点? 我是否需要更改postgres中的任何配置?
答案 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"