当前位置: 首页 > 编程日记 > 正文

postgresql开发中可能有用的知识

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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$
DECLAREr RECORD;del bool;num int4 := 0;sql "varchar";
BEGINsql := 'select id,receiveuserid,senduserid,senddelete,receivedelete from message where id in (' || ids || ')';FOR r IN EXECUTE sql LOOPdel := false;IF r.receiveuserid=userid and r.senduserid=userid THENdel := true;ELSEIF r.receiveuserid=userid THENIF r.senddelete=false THENupdate message set receivedelete=true where id = r.id;ELSEdel := true;END IF;ELSEIF r.senduserid=userid THENIF r.receivedelete=false THENupdate message set senddelete=true where id = r.id;ELSEdel := true;END IF;END IF;IF del THENdelete from message where id = r.id;num := num + 1;END IF;END LOOP;return num;
END;
$BODY$LANGUAGE 'plpgsql' VOLATILE;

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

SELECTpg_proc.proname  AS  "函数名称" ,pg_type.typname  AS  "返回值数据类型" ,pg_proc.pronargs  AS  "参数个数"
FROMpg_procJOIN  pg_typeON  (pg_proc.prorettype = pg_type.oid)
WHEREpg_type.typname !=  'void'AND  pronamespace = ( SELECT  pg_namespace.oid  FROM  pg_namespace  WHERE  nspname =  'public' );


例如:

         函数名称          | 返回值数据类型 | 参数个数 
---------------------------+----------------+----------somefunc                  | int4           |        0getemp                    | emp            |        1delucsmmempreviousdata    | trigger        |        0deldiskstatuspreviousdata | 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



转载于:https://my.oschina.net/huhaoren/blog/297357

相关文章:

css实现 textarea 高度自适应

此textarea非彼textarea &#xff0c;有经验的老司机们应该知道html标签contenteditable这个属性。 利用此属性使当前的标签成为可以输入的状态&#xff0c;等同于输入框。 演示地址&#xff1a;https://xibushijie.github.io/static/textareaHeihgAuto.html <!DOCTYPE html…

LTE PUCCH Format1

PUCCH 格式 1/1a/1b 是向eNodeB传递1或2或4位数据。 这个过程相当复杂&#xff0c;我们用如下3个章节来描述&#xff1a; PUCCH Format 1,1a,1b 所在RB位置PUCCH F1信号的生成PUCCH 多UE 复用 PUCCH Format 1,1a,1b 所在RB位置 LTE中有很多课题(尤其是物理层)&#xff0c;如…

innodb force recovery

innodb force recovery的6种设置&#xff1a; 1.innodb force recovery1&#xff0c;即使发现了损坏页面也继续让服务器继续运行&#xff0c;这个选项对于备份或者转存当前数据尤为有用2.innodb force recovery2&#xff0c;阻止恢复主线程的运行&#xff0c;如果清除操作会导致…

随机森林 java_机器学习weka,java api调用随机森林及保存模型

工作需要&#xff0c;了解了一下weka的java api&#xff0c;主要是随机森林这一块&#xff0c;刚开始学习&#xff0c;记录下。了解不多&#xff0c;直接上demo&#xff0c;里面有一些注释说明&#xff1a;package weka;import java.io.File;import weka.classifiers.Classifie…

[转载]64位linux安装WPS

2019独角兽企业重金招聘Python工程师标准>>> 网上下载了最新的WPS&#xff0a;.deb 安装后发现运行不了。&#xff08;点Unity > WP搜出来的图标&#xff09; 还以为安装有问题。于是重装了几次。还是不成功。 然后打开终端 wps 原来是程序出错了 提示找不到/opt…

mybatis报错There is no getter for property named '***' in 'class ***'

mybatis报错There is no getter for property named *** in class ***&#xff0c; 检查一看是xml中映射字段拼写错误&#xff0c;大小写。 有的时候用插件生成了原始的代码没问题&#xff0c;增加了一个字段在没有再自动生成的时候&#xff0c; 喜欢自己手动加一部分进去&…

LTE - PUCCH Format2

LTE中有很多课题(尤其是物理层)&#xff0c;如果不仔细阅读规范中给出的每个参数和方程&#xff0c;是无法解释清楚的。物理资源分配就是其中之一。 PUCCH格式2/2a/2b的物理资源分配由以下过程确定。看到这些公式千万不要惊慌&#xff0c;方程本身就是高中数学的一部分&#xf…

数据绑定(Binding)

Windows Presentation Foundation (WPF) 中的数据绑定为应用程序提供了一种简单、一致的数据表示和交互方法。元素能够以公共语言运行时 (CLR) 对象和 XML 形式绑定到来自各种数据源的数据。 什么是数据绑定&#xff1f; 数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程…

java exception源码_Java异常之 Error 和 Exception

简单了解 Java 异常1、实际工作中&#xff0c;遇到的情况不可能是非常完美的。比如&#xff1a;你写的某个模块&#xff0c;用户输入不一定符合你的要求&#xff1b;你的程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff1b;你要读取数据库的数据&am…

面向对象解决了全局变量问题?

2019独角兽企业重金招聘Python工程师标准>>> 全局变量的应用场景 程序中的某些资源之多能有一个&#xff0c;比如计数器、配置信息、程序运行状态等&#xff0c;而且许多地方需要访问他&#xff0c;那么这个资源就应该&#xff0c;也只能设置成全局变量。在稍微大点…

物理层UL基本流程

物理层发端的基本流程在36.211/36.212(NR:38.211/38.212)中有详细的描述&#xff0c;现在归纳如下。下面列出的每个步骤对于某些信道而言可能会增加其它步骤&#xff0c;也可能有些步骤不需要。 CRC 相关 信道编码(channel coding) LTE: NR: 加扰-Scrambling 加扰过程是da…

java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

import java.util.ArrayDeque;import java.util.Queue;import java.util.Stack;//二叉树的建树&#xff0c;前中后 递归非递归遍历 层序遍历//Node节点class Node {int element;Node left;Node right;public Node() {}public Node(int element) {this.element element;}}// Bi…

html5小趣味知识点系列(一)autofocus

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>autofocus</title> </head> <body><input type"text" autofocus value"页面中只能有一个哦"><!-- 如…

cisco aaa 授权后门测试

最近遇到一个客户aaa没有正确的配置&#xff0c;导致自己被关在设备外面的case&#xff1b;由于是生产环境的多交换机堆叠单元&#xff0c;重启忽略配置也是不允许的&#xff0c;且必须远程操作解决&#xff0c;无疑提升了解决问题的难度。多次尝试后发现通过cisco acs上的一些…

hive的基本命令

创建表 CREATE TABLE pokes (foo INT, bar STRING); 创建表并创建索引字段ds CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); 显示所有表 SHOW TABLES; 按正条件&#xff08;正则表达式&#xff09;显示表&#xff0c; SHOW TABLES .*s; 表添加一列…

MMSE(Minimum Mean Square Error)

MMSE是一种最小化接收数据的MSE(均方误差)的模型。关于这句话&#xff0c;你的脑海里就会出现很多问题: 什么是均方误差? “最小化MSE”的物理意义是什么? 让我们从一个我们现在非常熟悉的信道模型开始. MMSE作为一种均衡器&#xff0c;是一种后处理算法&#xff0c;它帮助…

java控制台两个字符串_java控制台输入字符串

实验要求: 1/7 1.掌握 JDK 的安装及参数配置方法,能在控制台界面使用 Java 命令进行 Java 程序的编译及运行。 2.掌握 Eclipse 软件安装方法。3.掌握在 ......习题1. 数据类型转换应用【案例简介】下例说明了整型、浮点型、字符串型之间的相互转换。 【案例目的】掌握 Java 中两…

lua单链表实现

List {}--创建一个节点function List.new(val)return {pnext nil, value val}end--往一个节点后添加一个节点function List.addNode(nodeParent, nodeChild)nodeChild.pnext nodeParent.pnextnodeParent.pnext nodeChildreturn nodeChildend--输出链表function List.print…

Java语言的基础知识9

第十一章(线程)1、通过String nameThread.currentThread().getName();来获取当前线程的名称。2、多次启动一个线程或者启动一个已经运行的线程是非法的,会抛出IllegalThreadStateException异常对象。Thread.sleep((int)Math.random()*10000);3、java提供了Runnable接口使继承了…

Android Parcelable的介绍与使用

Parcelable使用的一个地方就是在进程间传递一个自定义的较为复杂的对象&#xff0c;对Parcelable学习了一下写下自己的观点。 将一个对象比如说一个名字为Cartoon的自定义类&#xff0c;由一个activity传递到另外一个activity去&#xff0c;这个时候就要用到Parcelable了。首先…

LTE PUCCH F2 TX/RX汇总

TX TX端的公式如下(下图来自sharetechnote)&#xff1a; 发送端在36.212/36.211中有详细的描述&#xff0c;就是一系列的数学运算&#xff0c;过程概括如下&#xff1a; 编码、加扰、调制的过程暂不介绍&#xff0c;主要介绍下上图中乘以r_uv的过程&#xff0c;公式如下&#…

面试题:查询连续出现的数字

难度&#xff1a;中等 写一段SQL查询至少连续出现3次的数字。 --------- | Id | Num | --------- | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | --------- 例如&#xff1a;上图表 Logs&#xff0c; 1 是唯一一个连续出现3次的…

php的数组排序方法,PHP数组排序函数

在使用 PHP 进行编程时&#xff0c;有时需要对数组进行排序&#xff0c;通常我们使用的对数组进行排序的方法有冒泡排序、快速排序等等。我们除了可以自定义一些数组排序的函数外&#xff0c;PHP 还内置了多种对数组进行排序的函数&#xff0c;这些函数允许用户在数组内部对元素…

介绍并扩展Fitnesse的测试模块化机制:Scenario

2019独角兽企业重金招聘Python工程师标准>>> 首先普及一下概念&#xff0c;什么是Fitnesse&#xff0c;听一听.NET版Cucumber的创始人Aslak Hellesy谈Fitnesse与Cucumber对比&#xff1a; FIT/Fitnesse和Cucumber都执行高级语言编写的验收测试。FIT仅识别HTML&#…

cmake, This may result in binaries being created in the wrong place

现象&#xff1a; CMake Error: The current CMakeCache.txt directory /home/etouch/minigui-64/minigui/libmgeff-1.0.0/CMakeCache.txt is different than the directory /home/weiym/devel/minigui/rel-3-0/libmgeff-1.0 where CMakeCache.txt was created. This may resul…

GDB调试技巧

1. GDB 调试程序 1.Run a program without any argument. gdb program 2. Run a program with arguments gdb --args program arg1 arg2 ... argN or gdb program (gdb) r arg1 arg2 ... argN 3. start with both an executable program and a core file specified gdb…

php 进程管理,php如何管理进程

进程管理-防止进程成为僵尸进程创建好了进程&#xff0c;那么怎么对子进程进行管理呢&#xff1f;使用信号&#xff0c;对子进程的管理&#xff0c;一般有两种情况&#xff1a;(推荐学习&#xff1a;PHP编程从入门到精通)posix_kill()&#xff1a;此函数并不能顾名思义&#xf…

Linux分区的认识

有时候为了便于管理硬盘或允许在一块硬盘上使用多个文件系统或操作系统&#xff0c;需要对硬盘进行分区操作。硬盘的分区分为3种&#xff1a;主分区、扩展分区、逻辑分区。通常因为计算机BIOS和MBR的限制&#xff0c;一块硬盘最多只能有4个分区&#xff0c;其中一个主分区可用扩…

求小数的小数点的第n位是什么

链接&#xff1a;https://ac.nowcoder.com/acm/contest/548/B来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K64bit IO Format: %lld题目描述 立华奏在学习初中数学的时候遇到了这样一…

Git 简介1-常用术语

常用术语 1. origin origin是对项目最初克隆(clone)的远程仓库的缩写。 更准确地说&#xff0c;origin 是用来代替原始(original)远程仓库的URL, 从而使在git 命令中使用原始仓库更加容易。 2. master master 是分支的命名约定。 从远程服务器克隆后&#xff0c;生成的本…