天天看點

資料庫操作之間的校驗以及常見操作

操作資料庫之前的判斷

插入資料:關注主鍵與唯一鍵

  • 插入資料前應先校驗該表的主鍵,唯一鍵;
CREATE OR REPLACE FUNCTION func_mppd30101() RETURNS INTEGER AS
$BODY$
BEGIN
    perform * FROM tbl_dic WHERE dic_id = 59901 or (dic_type_id=5 and dic_name='98') ;
    if not found then
        INSERT INTO tbl_dic(dic_id, dic_type_id, dic_name, dic_value, is_lock) VALUES (59901, 5, '98', '待識别', 1);
    end if;
    return 0;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;      
  • 應明确該表是否有依賴于其他表的外鍵,若有,則應先明确關聯表中是否存在待插入的關聯字段資料;
  • 在imos_init.sql腳本中插入資料時,若有上述外鍵關聯,應特别注意插入資料的先後順序。

删除資料及資料表:關注外鍵

  • 進行删除資料表操作前,應先明确該資料表的關聯關系,梳理清楚後進行級聯删除;
  • 删除資料前,應先明确是否有外鍵依賴于該表中字段,若有,應先删除相關表中資料。

更新資料:關注更新項,如果是主鍵或者是唯一鍵,則要判斷更新之後的資料是否會導緻沖突;如果是外鍵,則判斷更新之後的資料是否在其他表中存在

  • 資料表中的更新操作若可采用先删除再插入的操作代替,則優先選擇先删後插操作;
  • 進行更新操作前,應先明确更新後的資料是否會導緻主鍵、唯一鍵沖突,是否存在外鍵關聯;
  • 值得注意的是,更新資料的校驗項應為判斷更新後資料是否存在在表中,若不存在,則更新(針對主鍵、唯一鍵)。
  • 增删限制:
  • 在已有表的情況下添加唯一鍵、外鍵等限制,要考慮該表及其關聯表中之前存在的資料是否允許添加該限制;
  • 在對資料表進行操作前,應先明确該表是否存在分表,若存在分表,應充分考慮分表的對應修改。

對資料表中已有表進行修改包括更改主外鍵、修改字段等操作前,應讓業務組明确使用該表的各業務組之間已拉通讨論過明确可修改後再進行修改,避免出現影響部分業務的情況。

添加字段的時候,注意該表示是否有分表,如果有分表,則與注意該表的分表建表函數中也要添加新增的字段;

同時,新增字段如果給非空限制,那麼一定要給預設值,否則,如果在添加字段的時候,該表中已經有資料了,則會報錯;

注意保持新安裝和更新的一緻性

常用資料庫對象存在性查詢語句

1、判斷某個表是否存在

SELECT * FROM pg_tables WHERE tablename='tbl_res';      

2、判斷某個表的某個字段是否存在

SELECT attname FROM pg_attribute WHERE attname = 'autoid' and  attrelid = 'tbl_version'::regclass;      

3、判斷某個表的某個限制是否存在

SELECT conname FROM pg_constraint WHERE conname = 'fk_tbl_ec_info_dev_code' and  conrelid = 'tbl_ec_info'::regclass;      

4、判斷某個表的索引是否存在

SELECT * FROM pg_indexes WHERE tablename='tbl_operlog' and indexname='idx_tbl_operlog_oper_time_operlog_id';      

5、判斷某個序列是否存在

SELECT * FROM information_schema.sequences WHERE sequence_name='seq_tbl_user_favorite_fav_res_order';      

6、判斷某個觸發器是否存在

SELECT tgrelid::regclass,tgname, (select proname from pg_proc where oid =tgfoid)  FROM pg_trigger WHERE tgname='tri_res_name_2_pinyin';      

7、判斷某個視圖是否存在

SELECT * FROM pg_views WHERE viewname='videorestable';      

8、判斷某個類型是否存在

SELECT * FROM pg_type WHERE typname='imos_code';      

9、判斷某個字段的資料類型是否為某類型

10、根據資料庫oid查詢資料庫名稱

select datname from pg_database where oid=16384;      

11、根據表的oid查詢表名稱

select relname, relfilenode from pg_class where relfilenode=25811;      

對象建立語句

1、建立索引示例:

CREATE INDEX inx_tbl_wgs2mars_10000_lon_lat ON tbl_wgs2mars_10000 USING btree (lon,lat);      

2、建立視圖示例:

CREATE OR REPLACE VIEW view_res AS
   SELECT res_id ORG_ID, res_name ORG_NAME, parent_res_id PARENT_ORG_ID, phy_res_code ORG_CODE, res_level ORG_LEVEL, res_order_number ORG_ORDER FROM tbl_res;      
--先建立觸發器函數
CREATE OR REPLACE FUNCTION notify_tbl_role_change()
  RETURNS trigger AS
$BODY$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        PERFORM * from  pg_notify('asserver', 'role_info_cache ' || OLD.role_id::text || '_'|| OLD.role_id::text ||' DELETE');
        PERFORM * from  pg_notify('com_tbl_cache', 'tbl_role ' || OLD.role_id::text || ' DELETE');
        RETURN OLD;
    ELSIF (TG_OP = 'UPDATE') THEN
        PERFORM  * from  pg_notify('asserver', 'role_info_cache ' || NEW.role_id::text|| '_'|| NEW.role_id::text || ' UPDATE');
        PERFORM * from  pg_notify('com_tbl_cache', 'tbl_role ' || NEW.role_id::text || ' UPDATE');
        RETURN NEW;
    ELSIF (TG_OP = 'INSERT') THEN
        PERFORM * from  pg_notify('asserver', 'role_info_cache ' || NEW.role_id::text|| '_'|| NEW.role_id::text || ' ADD');
        PERFORM * from  pg_notify('com_tbl_cache', 'tbl_role ' || NEW.role_id::text || ' ADD');
        RETURN NEW;
    END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION notify_tbl_role_change()
  OWNER TO postgres;
--建立觸發器将函數挂在表上
CREATE TRIGGER notify_tbl_role_change AFTER INSERT OR DELETE OR UPDATE ON tbl_role FOR EACH ROW EXECUTE PROCEDURE notify_tbl_role_change();      
CREATE SEQUENCE seq_tbl_user_favorite_fav_res_order
              START WITH 1
              INCREMENT BY 1
              NO MINVALUE
              NO MAXVALUE
              CACHE 1;
ALTER SEQUENCE public.seq_tbl_user_favorite_fav_res_order OWNER TO postgres;
```