postgresql開發中可能有用的知識

postgresql手冊

1、PostgreSQL中能夠直接對時間進行加減運算:

查詢系統當前時間:html

select now();
或者
select current_timestamp;
sql

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字段轉換整天 而後相加
數據庫

2、PostgreSQL存儲過程小案例

一、建立存儲過程格式:
centos

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;

二、查看本身創建的存儲過程或者說函數的命令yii

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

三、刪除函數post

例如刪除delucsmmempreviousdata函數:測試

delete from pg_proc where pg_proc.proname='delucsmmempreviousdata';ui

2、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;


3、centos中執行postgresql相關的命令

一、進入數據庫終端

psql 數據庫名 -U 用戶名

二、查看全部的數據庫名

\l或者\list

相關文章
相關標籤/搜索