postgresql开发中可能有用的知识有哪些

104次阅读
没有评论

共计 5133 个字符,预计需要花费 13 分钟才能阅读完成。

这篇文章主要介绍 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
$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;
$BODY$
 LANGUAGE  plpgsql  VOLATILE;

2、查看自己建立的存储过程或者说函数的命令

SELECT
 pg_proc.proname AS  函数名称  ,
 pg_type.typname AS  返回值数据类型  ,
 pg_proc.pronargs AS  参数个数 
 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 的触发器是数据库自动执行 \ 指定的数据库事件发生时调用的回调函数。以下是有关 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;

三、centos 中执行 postgresql 相关的命令

1、进入数据库终端

psql 数据库名 -U 用户名

2、查看所有的数据库名

\l 或者 \list

以上是“postgresql 开发中可能有用的知识有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计5133字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)