postgresql開發(fā)中可能有用的知識(shí)有哪些

這篇文章主要介紹postgresql開發(fā)中可能有用的知識(shí)有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

我們注重客戶提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),我們努力開拓更好的視野,通過不懈的努力,創(chuàng)新互聯(lián)贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),小程序開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫(kù)的技術(shù)開發(fā)工程師。

一、PostgreSQL中可以直接對(duì)時(shí)間進(jìn)行加減運(yùn)算:

查詢系統(tǒng)當(dāng)前時(shí)間:

select now();
或者
select current_timestamp;

SELECT now()::timestamp + '1 year';  --當(dāng)前時(shí)間加1年
SELECT now()::timestamp + '1 month';  --當(dāng)前時(shí)間加一個(gè)月
SELECT now()::timestamp + '1 day';  --當(dāng)前時(shí)間加一天
SELECT now()::timestamp + '1 hour';  --當(dāng)前時(shí)間加一個(gè)小時(shí)
SELECT now()::timestamp + '1 min';  --當(dāng)前時(shí)間加一分鐘
SELECT now()::timestamp + '1 sec';  --加一秒鐘
select now()::timestamp + '1 year 1 month 1 day 1 hour 1 min 1 sec';  --加1年1月1天1時(shí)1分1秒
SELECT now()::timestamp + (col || ' day')::interval FROM table --把col字段轉(zhuǎn)換成天 然后相加

二、PostgreSQL存儲(chǔ)過程小案例

1、創(chuàng)建存儲(chǔ)過程格式:

CREATE OR REPLACE FUNCTION 函數(shù)名(參數(shù)1,[整型 int4, 整型數(shù)組 _int4, ...])
RETURNS 返回值類型 AS
$BODY$
DECLARE
變量聲明
BEGIN
函數(shù)體
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE;

實(shí)例:

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、查看自己建立的存儲(chǔ)過程或者說函數(shù)的命令

SELECT
   pg_proc.proname  AS  "函數(shù)名稱" ,
   pg_type.typname  AS  "返回值數(shù)據(jù)類型" ,
   pg_proc.pronargs  AS  "參數(shù)個(gè)數(shù)"
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' );


例如:

         函數(shù)名稱          | 返回值數(shù)據(jù)類型 | 參數(shù)個(gè)數(shù) 
---------------------------+----------------+----------
 somefunc                  | int4           |        0
 getemp                    | emp            |        1
 delucsmmempreviousdata    | trigger        |        0
 deldiskstatuspreviousdata | trigger        |        0

3、刪除函數(shù)

例如刪除delucsmmempreviousdata函數(shù):

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

二、PostgreSQL觸發(fā)器

參考:Postgresql觸發(fā)器

PostgreSQL的觸發(fā)器是數(shù)據(jù)庫(kù)自動(dòng)執(zhí)行\(zhòng)指定的數(shù)據(jù)庫(kù)事件發(fā)生時(shí)調(diào)用的回調(diào)函數(shù)。以下是有關(guān)PostgreSQL的觸發(fā)器的要點(diǎn): www.yiibai.com

  • PostgreSQL的觸發(fā)可以指定觸發(fā)操作前嘗試一行(在檢查約束之前INSERT,UPDATE或DELETE)或操作完成后(在檢查約束之后和INSERT,UPDATE或DELETE(刪除)已完成),或替代的操作(在視圖上插入,更新或刪除的情況下)..

  • FOR EACH ROW觸發(fā)器被標(biāo)記的操作修改的每一行被稱為一次。相比之下,F(xiàn)OR EACH STATEMENT觸發(fā)器為只執(zhí)行一次對(duì)于任何給定的操作,不管它有多少行修改。

  • WHEN子句和觸發(fā)器動(dòng)作可能訪問的行元素被插入,刪除或更新使用的形式NEW.column-name和OLD.column-name,其中列名是從表中的列名的引用該觸發(fā)器相關(guān)聯(lián)的。 www.yiibai.com

  • 如果提供WHEN子句,PostgreSQL的報(bào)表只執(zhí)行WHEN子句為true的行。如果沒有提供WHEN子句,PostgreSQL的語(yǔ)句執(zhí)行的所有行。

  • 如果有多個(gè)相同類型的觸發(fā)器定義了相同的事件,他們將被觸發(fā)名稱是按字母順序排列。

  • BEFORE,AFTER或INSTEAD OF關(guān)鍵字決定何時(shí)觸發(fā)動(dòng)作將被執(zhí)行,相對(duì)于插入,修改或移除相關(guān)的行。www.yiibai.com

  • 觸發(fā)器表,它們與丟棄時(shí)自動(dòng)刪除。 yiibai.com

  • 要修改的表必須存在,在同一數(shù)據(jù)庫(kù)中的表或視圖,觸發(fā)器被附加,必須使用表名而不使用database.tablename。

  • 約束時(shí)指定的選項(xiàng)創(chuàng)建一個(gè)約束觸發(fā)器。這是一個(gè)普通的觸發(fā)器除外,可以調(diào)整使用SET(設(shè)定)約束的觸發(fā)器觸發(fā)的定時(shí)相同。預(yù)計(jì)約束觸發(fā)器違反他們所實(shí)施的限制時(shí)引發(fā)異常..

語(yǔ)法:

創(chuàng)建觸發(fā)器的基本語(yǔ)法如下:

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....];

例子

讓我們考慮一個(gè)情況下,我們要保持審核COMPANY表中的每一條記錄被插入,我們將創(chuàng)建新如下(如果已經(jīng)創(chuàng)建過,那么刪除COMPANY表)

testdb=# CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL);

為了保持審核的測(cè)試,我們將創(chuàng)建一個(gè)新的表被稱為審計(jì)將被插入日志消息每當(dāng)有一個(gè)新的記錄條目表COMPANY:www.yiibai.com

testdb=# CREATE TABLE AUDIT(
    EMP_ID INT NOT NULL,
    ENTRY_DATE TEXT NOT NULL);

這里的ID是審計(jì)記錄ID,EMP_ID的ID來自COMPANY表,日期將保持公司表時(shí)的記錄將被創(chuàng)建時(shí)間戳。所以,現(xiàn)在讓我們創(chuàng)建一個(gè)觸發(fā)器,COMPANY 表如下:

testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

auditlogfunc()是一個(gè)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;

現(xiàn)在,讓我們開始COMPANY 表插入記錄,這將導(dǎo)致在審核表中創(chuàng)建審計(jì)日志記錄。因此,讓我們創(chuàng)建一個(gè)COMPANY 表記錄如下:

testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );

這將創(chuàng)建一個(gè)記錄COMPANY 表如下: yiibai.com

 id | name | age | address      | salary
----+------+-----+--------------+--------
  1 | Paul |  32 | California   |  20000

同時(shí)審核表中創(chuàng)建一條記錄。這條記錄是一個(gè)觸發(fā)我們已經(jīng)創(chuàng)建了COMPANY 表上的INSERT操作的結(jié)果。類似的方式,也可以創(chuàng)建觸發(fā)器,UPDATE和DELETE操作根據(jù)要求。

 emp_id |          entry_date
--------+-------------------------------
      1 | 2013-05-05 15:49:59.968+05:30
(1 row)

列出觸發(fā)器

可以列出當(dāng)前數(shù)據(jù)庫(kù)中的所有觸發(fā)器從pg_trigger表如下:

testdb=# SELECT * FROM pg_trigger;
或者
select trigger_name from information_schema.triggers;

以上PostgreSQL的表會(huì)列出所有觸發(fā)器。

如果要列出特定表上的觸發(fā)器,然后使用條款與表名如下:

testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

以上PostgreSQL的表也會(huì)列出只有一個(gè)條目如下:

     tgname
-----------------
 example_trigger
(1 row)

刪除觸發(fā)器

以下是DROP命令可以用來刪除一個(gè)現(xiàn)有的觸發(fā): yiibai.com

testdb=# DROP TRIGGER trigger_name on tablename;


三、centos中執(zhí)行postgresql相關(guān)的命令

1、進(jìn)入數(shù)據(jù)庫(kù)終端

psql 數(shù)據(jù)庫(kù)名 -U 用戶名

2、查看所有的數(shù)據(jù)庫(kù)名

\l或者\(yùn)list

以上是“postgresql開發(fā)中可能有用的知識(shí)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前名稱:postgresql開發(fā)中可能有用的知識(shí)有哪些
轉(zhuǎn)載注明:http://muchs.cn/article44/gjsdhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、品牌網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站排名、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)