1. 程式人生 > 實用技巧 >PostgreSQL 大小寫問題 一鍵修改表名、欄位名為小寫

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);