操作数据库之前的判断
插入数据:关注主键与唯一键
- 插入数据前应先校验该表的主键,唯一键;
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;
3、新建触发器示例:
--先创建触发器函数
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();
4、创建序列示例:
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;
```