PostgreSQL开发中实用的知识
一、PostgreSQL中可以直接对时间进行加减运算:
查询系统当前时间:
select now(); 或者 select current_timestamp;
SELECT now()::timestamp + '1 year'; --当前时间加1年
SELECT now()::timestamp + '1 month'; --当前时间加一个月
SELECT now()::timestamp + '1 day'; --当前时间加一天
SELECT now()::timestamp + '1 hour'; --当前时间加一个小时
SELECT now()::timestamp + '1 min'; --当前时间加一分钟
SELECT now()::timestamp + '1 sec'; --加一秒钟
select now()::timestamp + '1 year 1 month 1 day 1 hour 1 min 1 sec'; --加1年1月1天1时1分1秒
SELECT now()::timestamp + (col || ' day')::interval FROM table --把col字段转换成天 然后相加
二、PostgreSQL存储过程小案例
1、创建存储过程格式:
CREATE OR REPLACE FUNCTION 函数名(参数1,[整型 int4, 整型数组 _int4, ...]) RETURNS 返回值类型 AS $BODY$ DECLARE 变量声明 BEGIN 函数体 END; $BODY$ LANGUAGE ‘plpgsql’ VOLATILE;
实例:
CREATE OR REPLACE FUNCTION message_deletes(ids "varchar", userid int8) RETURNS int4 AS $BODY$ DECLARE r RECORD; del bool; num int4 := 0; sql "varchar"; BEGIN sql := 'select id,receiveuserid,senduserid,senddelete,receivedelete from message where id in (' || ids || ')'; FOR r IN EXECUTE sql LOOP del := false; IF r.receiveuserid=userid and r.senduserid=userid THEN del := true; ELSEIF r.receiveuserid=userid THEN IF r.senddelete=false THEN update message set receivedelete=true where id = r.id; ELSE del := true; END IF; ELSEIF r.senduserid=userid THEN IF r.receivedelete=false THEN update message set senddelete=true where id = r.id; ELSE del := true; END IF; END IF; IF del THEN delete from message where id = r.id; num := num + 1; END IF; END LOOP; return num; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE;
2、查看自己建立的存储过程或者说函数的命令
SELECT
pg_proc.proname
AS
"函数名称"
,
pg_type.typname
AS
"返回值数据类型"
,
pg_proc.pronargs
AS
"参数个数"
FROM
pg_proc
JOIN
pg_type
ON
(pg_proc.prorettype = pg_type.oid)
WHERE
pg_type.typname !=
'void'
AND
pronamespace = (
SELECT
pg_namespace.oid
FROM
pg_namespace
WHERE
nspname =
'public'
);
例如:
函数名称 | 返回值数据类型 | 参数个数 ---------------------------+----------------+---------- somefunc | int4 | 0 getemp | emp | 1 delucsmmempreviousdata | trigger | 0 deldiskstatuspreviousdata | trigger | 0
3、删除函数
例如删除delucsmmempreviousdata函数:
delete from pg_proc where pg_proc.proname='delucsmmempreviousdata';
二、PostgreSQL触发器
PostgreSQL的触发器是数据库自动执行\指定的数据库事件发生时调用的回调函数。以下是有关PostgreSQL的触发器的要点: www.yiibai.com
-
PostgreSQL的触发可以指定触发操作前尝试一行(在检查约束之前INSERT,UPDATE或DELETE)或操作完成后(在检查约束之后和INSERT,UPDATE或DELETE(删除)已完成),或替代的操作(在视图上插入,更新或删除的情况下)..
-
FOR EACH ROW触发器被标记的操作修改的每一行被称为一次。相比之下,FOR EACH STATEMENT触发器为只执行一次对于任何给定的操作,不管它有多少行修改。
-
WHEN子句和触发器动作可能访问的行元素被插入,删除或更新使用的形式NEW.column-name和OLD.column-name,其中列名是从表中的列名的引用该触发器相关联的。 www.yiibai.com
-
如果提供WHEN子句,PostgreSQL的报表只执行WHEN子句为true的行。如果没有提供WHEN子句,PostgreSQL的语句执行的所有行。
-
如果有多个相同类型的触发器定义了相同的事件,他们将被触发名称是按字母顺序排列。
-
BEFORE,AFTER或INSTEAD OF关键字决定何时触发动作将被执行,相对于插入,修改或移除相关的行。www.yiibai.com
-
触发器表,它们与丢弃时自动删除。 yiibai.com
-
要修改的表必须存在,在同一数据库中的表或视图,触发器被附加,必须使用表名而不使用database.tablename。
-
约束时指定的选项创建一个约束触发器。这是一个普通的触发器除外,可以调整使用SET(设定)约束的触发器触发的定时相同。预计约束触发器违反他们所实施的限制时引发异常..
语法:
创建触发器的基本语法如下:
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name ON table_name[ -- Trigger logic goes here....];
Here event_name could be INSERT, DELETE, UPDATE, and TRUNCATE database operation on the mentioned table table_name. You can optionally specify FOR EACH ROW after table name.
Following is the syntax of creating a trigger on an UPDATE operation on one or more specified columns of a table as follows:
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name[ -- Trigger logic goes here....];
例子
让我们考虑一个情况下,我们要保持审核COMPANY表中的每一条记录被插入,我们将创建新如下(如果已经创建过,那么删除COMPANY表)
testdb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);
为了保持审核的测试,我们将创建一个新的表被称为审计将被插入日志消息每当有一个新的记录条目表COMPANY:www.yiibai.com
testdb=# CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL);
这里的ID是审计记录ID,EMP_ID的ID来自COMPANY表,日期将保持公司表时的记录将被创建时间戳。所以,现在让我们创建一个触发器,COMPANY 表如下:
testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
auditlogfunc()是一个PostgreSQL的过程,有以下定义:
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$ BEGIN INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp); RETURN NEW; END;$example_table$ LANGUAGE plpgsql;
现在,让我们开始COMPANY 表插入记录,这将导致在审核表中创建审计日志记录。因此,让我们创建一个COMPANY 表记录如下:
testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );
这将创建一个记录COMPANY 表如下: yiibai.com
id | name | age | address | salary ----+------+-----+--------------+-------- 1 | Paul | 32 | California | 20000
同时审核表中创建一条记录。这条记录是一个触发我们已经创建了COMPANY 表上的INSERT操作的结果。类似的方式,也可以创建触发器,UPDATE和DELETE操作根据要求。
emp_id | entry_date --------+------------------------------- 1 | 2013-05-05 15:49:59.968+05:30 (1 row)
列出触发器
可以列出当前数据库中的所有触发器从pg_trigger表如下:
testdb=# SELECT * FROM pg_trigger; 或者 select trigger_name from information_schema.triggers;
以上PostgreSQL的表会列出所有触发器。
如果要列出特定表上的触发器,然后使用条款与表名如下:
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
以上PostgreSQL的表也会列出只有一个条目如下:
tgname ----------------- example_trigger (1 row)
删除触发器
以下是DROP命令可以用来删除一个现有的触发: yiibai.com
testdb=# DROP TRIGGER trigger_name on tablename;