PostgreSQL 大小寫問題 一鍵修改表名、字段名為小寫


標准的SQL是不區分大小寫的。但是PostgreSQL對於數據庫中對象的名字允許使用支持大小寫區分的定義和引用方法。方式就是在DDL中用雙引號把希望支持大小的對象名括起來。
比如希望創建一個叫AAA的表。如果用CREATE TABLE AAA (...);的話,創建出來的表實際上是aaa。
如果希望創建大寫的AAA表的話,就需要用CREATE TABLE "AAA" (...);這種雙引號的方式定義對象名。
這樣寫的缺點是查詢語句必須也使用雙引號的方式引用對象名。比如SELECT * FROM "AAA";否則PostgreSQL缺省會去找aaa這個對象,然后返回aaa不存在的錯誤。需要注意的是不僅僅是表可以這樣定義和引用,對PostgreSQL中的任意對象(比如列名,索引名等)都有效。

 

創建exec(sqlstring)函數方便執行

CREATE OR REPLACE FUNCTION "public"."exec"("sqlstring" varchar)
  RETURNS "pg_catalog"."varchar" AS $BODY$
    declare
        res varchar(50);
    BEGIN
        EXECUTE sqlstring;
        RETURN 'ok';
    END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

  

通過條件拼接SQL,

-- 根據條件查詢所有大寫的column
select * from information_schema.columns where table_schema='public' and table_name<>'pg_stat_statements' and column_name <> lower(column_name);

-- 修改條件后,通過下列語句轉換column_name中的大寫字母
SELECT
    exec('alter table "' || table_name || '" rename column  "' || column_name || '" to ' || lower( column_name ) || ';')
FROM
    information_schema.COLUMNS 
WHERE
    table_schema = 'public' 
    AND column_name <> lower(column_name)
    AND table_name <> 'pg_stat_statements' 
    AND table_name = 'prescribe_state_copy1';
    
-- 查詢大寫的table_name
SELECT * FROM information_schema.TABLES WHERE   table_schema = 'public' AND table_catalog = 'Guns' AND table_name <> lower( table_name );

-- 修改表名中的大寫為小寫
SELECT
    exec ( 'alter table "' || table_name || '" rename to ' || lower( table_name ) || ';' ) 
FROM
    information_schema.tables 
WHERE
    table_schema='public' 
    and table_catalog = 'Guns' 
    and table_name <> lower(table_name);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM