创建表触发器的SQL语句
CREATE TRIGGER example_trigger BEFORE INSERT ON teaches
FOR EACH ROW
EXECUTE PROCEDURE example_function();
实例 :
首先创建测试表、视图
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE AUDIT_HIS(
EMP_ID INT NOT NULL,
EMP_NAME TEXT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
EMP_NAME TEXT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
CREATE OR REPLACE VIEW "public"."company_view" AS
SELECT company.id,company.name,company.age
2.创建触发器函数
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO AUDIT_HIS(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (OLD.ID,OLD.NAME,current_timestamp);
INSERT INTO AUDIT(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (NEW.ID,NEW.NAME,current_timestamp);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
注:
a.触发器函数是触发器触发时调用,函数返回的类型必须是TRIGGER ,且不能有任何参数
b.postgresql触发器函数中自带一些特殊变量:
NEW:数据类型是record,在insert、update操作触发时存储新的数据行
OLD:数据类型是record,在update、delete操作触发时存储旧的数据行
TG_OP:内容为“INSERT”,“UPDATE”,“DELETE”,“TRUNCATE”,用于指定DML语句类型
TG_TABLE_NAME:触发器所在表的表名称 TG_SCHEMA_NAME:触发器所在表的模式
创建触发器
表触发器
CREATE TRIGGER example_trigger AFTER INSERT OR UPDATE ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc()
意思 :在company表中插入或更新后创建触发器example_trigger
对于每一行执行过程auditlogfunc();
视图触发器
CREATE TRIGGER company_view_trigger AFTER UPDATE ON company_view
EXECUTE PROCEDURE auditlogfunc();
删除触发器
删除company表中的example_trigger触发器
DROP TRIGGER example_trigger on COMPANY;
删除函数
drop function function_name (parameters_list);
查看所有触发器
SELECT * FROM pg_trigger;
测试
INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝阳区', 9999);
UPDATE COMPANY SET NAME ='阿里巴巴' WHERE ID ='1';
PostgreSql INDEX 索引总结
1.创建索引
create index index_name on table_name(field_name1, field_name2,······);
CREATE INDEX index_name ON table_name USING btree
create index tbl_bb_index on tbl_bb(id,name);
注:tbl_bb 位表名称, tbl_bb_index 为创建的索引名称, id 和 name 为 表里的字段
注:默认创建B-tree索引
使得添加的index 生效:
ANALYSE index_name;
2.查询索引
1、select * from pg_indexes where tablename ='table_name';
runoobdb=# select * from pg_indexes where tablename ='company'; #查询company表的索引
RUNOOBDB
schemaname | tablename | indexname | tablespace |
indexdef
------------+-----------+-------------------+------------+---------------------
----------------------------------------------
public | company | company_pkey | | CREATE UNIQUE INDEX
company_pkey ON company USING btree (id)
public | company | unique_table_a_id | | CREATE UNIQUE INDEX
unique_table_a_id ON company USING btree (id)
(2 rows)
2、 select * from pg_statio_all_indexes where relname='tbname';
runoobdb=# select * from pg_statio_all_indexes where relname='company';
RUNOOBDB
relid | indexrelid | schemaname | relname | indexrelname | idx_blks_read
| idx_blks_hit
-------+------------+------------+---------+-------------------+---------------
+--------------
16487 | 16493 | public | company | company_pkey | 1
| 1
16487 | 16518 | public | company | unique_table_a_id | 1
| 1
(2 rows)
3.删除索引
drop index index_name;
index_name是要删除的索引名
注意 : 无法删除DBMS为主键约束和唯一约束自动创建的索引
常见无需创建索引情况
a. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;
b.表记录太少,不需要创建索引;
c.经常增删改的表,不需要创建索引;
d.表中包含大量重复数据,不需要创建索引,例如性别字段,只有男女,不适合建立索引;
常见索引无效情况
a. 没有查询条件,或者查询条件没有建立索引;
b. 在查询条件上没有使用引导列;
c. 查询的数量是大表的大部分,应该是30%以上;
d. 使用内部函数导致索引失效,例:select * from test where round(id)=10;
e. 表记录较少
f. 隐式转换导致索引失效,例如:表的字段tu_mdn定义为varchar2(20), 但在查询时把该字段作为number类型以where条件传给数据库:
错误的例子:select * from test where tu_mdn=13333333333;
正确的例子:select * from test where tu_mdn='13333333333';
g. 索引列进行运算导致索引失效,运算包括(+,-,*,/,! 等),例:
select * from test where round(id)=10;
runoobdb=# select * from company where round(id)=10;
RUNOOBDB
id | name | age | address | salary
----+------+-----+---------+--------
(0 rows)
h. like "%_" 百分号在前;
i.单独引用复合索引里非第一位置的索引列;
j. B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
PostgreSql INDEX 索引总结 :https://blog.csdn.net/nioqnw/article/details/84750297
PostgreSql TRIGGER 触发器简单样例 :https://blog.csdn.net/nioqnw/article/details/84633181