我正在使用 postgres 9.2。我需要将 postgres db 中所有表的所有列名更改为大写。
有没有办法做到这一点?我需要更改 postgres 中的任何配置吗?
我正在使用 postgres 9.2。我需要将 postgres db 中所有表的所有列名更改为大写。
有没有办法做到这一点?我需要更改 postgres 中的任何配置吗?
在我解释如何做到这一点之前,我强烈建议不要这样做。
在 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
的语句。
下面的查询创建 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;
this query must work
Alter table if exists tablename rename to "TABLENAME"