久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

postgresql開發中可能有用的知識有哪些

195次閱讀
沒有評論

共計 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字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 中江县| 牡丹江市| 连江县| 安庆市| 昔阳县| 和林格尔县| 寻乌县| 越西县| 通城县| 新安县| 莱芜市| 隆尧县| 左贡县| 株洲市| 海兴县| 遂宁市| 土默特左旗| 定远县| 宣汉县| 繁峙县| 滁州市| 韶山市| 林芝县| 奈曼旗| 兴城市| 开平市| 维西| 横峰县| 始兴县| 大竹县| 桃源县| 井冈山市| 海安县| 盱眙县| 马公市| 清水县| 隆回县| 锦州市| 剑川县| 炉霍县| 沂源县|