2014-12-04 36 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