在单个查询中重命名混合大小写表

时间:2014-12-04 05:36:32

标签: sql postgresql ddl

在我的PostgreSQL 9.2数据库中,有许多表具有混合大小写的名称,例如

Tbl_SalesTbl_PurchTbl_logMnth

我想做的是

 alter table "Table1" rename to table1

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

3 个答案:

答案 0 :(得分:3)

这是要使用的查询

  

ALTER TABLE名称       重命名为new_name

答案 1 :(得分: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;
$$

答案 2 :(得分:0)

您最好的选择可能是通过查询pg_tables catalog来生成一系列动态 SQL 语句,例如 Python 或类似语句。

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

sqlfiddle举了一个例子。

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

我建议按照架构列出白名单,例如foo以及您想要的任何其他人。例如,在小提琴中,您不希望触及publicpg_catalog模式中的任何内容。您也可以按information_schema进行过滤 - 您可能希望避免使用 postgres 用户拥有的任何内容。

另外,请注意,在创建表时,外壳无关紧要。如果表格tableowner已存在,然后我尝试创建foo,则会产生错误Foo