2014-12-04 37 views
4

在我PostgreSQL 9.2数据库中存在具有混合案例名称很多表,例如重命名大小写混合的表在单个查询

Tbl_SalesTbl_PurchTbl_logMnth

我想要做的就是

alter table "Table1" rename to table1 

但如何以简单的方式重命名我的数据库中的所有混合大小写表?

回答

2

使用以下选择来获得与混合情况表(一个或多个)的名称

SELECT table_name ucase,lower(table_name) lcase 
FROM information_schema.tables 
where table_type = 'BASE TABLE' and 
     table_schema = 'public' and 
     table_name ~ E'^[[:upper:]][^[:upper:]]' 

PostgreSQL的字符串函数lowerinformation_schema.tables

,并使用PL/PGSQL SQL - DO重命名都表混合案例

do 
$$ 
declare 
rw record; 
begin 
for rw in 
SELECT 'ALTER TABLE "'||t.ucase||'" RENAME to '||t.lcase||';' execme from (
SELECT table_name ucase, lower(table_name) lcase 
FROM information_schema.tables 
where table_type = 'BASE TABLE' and 
     table_schema = 'public' and 
     table_name ~ E'^[[:upper:]][^[:upper:]]')t 
loop 
execute rw.execme ; 
end loop; 
end; 
$$ 
3

这是使用

ALTER TABLE名 重命名为NEW_NAME

0

您最好的选择可能是产生一系列动态SQL语句,在,比如说查询, Python或查询pg_tables catalog

然后,您可以遍历您感兴趣的模式列表(或者如果您想这样做,所有这些列表,只要它们是用户创建的 - 您应该避免使用任何pg_其中包括Postgres本身),并检查小写名称是否与当前名称相同。如果它们不同,则可以生成重命名表所需的ALTER TABLE语句,然后执行它,确保您的更改为COMMIT

sqlfiddle举一个例子。

请注意我创建的foo表是如何列在那里的。

我建议按架构白名单,如public和任何其他你想要的。例如,在小提琴中,您不想触摸pg_cataloginformation_schema模式中的任何内容。你也可以通过tableowner进行过滤 - 例如,你可能想要避免使用者拥有的任何东西。

此外,请注意,创建表时,套管并不重要。如果表foo已经存在,然后我尝试创建Foo,则会导致错误ERROR: relation "foo" already exists