您好,登錄后才能下訂單哦!
這篇文章主要介紹postgresql開發(fā)中可能有用的知識有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
查詢系統(tǒng)當前時間:
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字段轉(zhuǎn)換成天 然后相加
1、創(chuàng)建存儲過程格式:
CREATE OR REPLACE FUNCTION 函數(shù)名(參數(shù)1,[整型 int4, 整型數(shù)組 _int4, ...]) RETURNS 返回值類型 AS $BODY$ DECLARE 變量聲明 BEGIN 函數(shù)體 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;
2、查看自己建立的存儲過程或者說函數(shù)的命令
SELECT pg_proc.proname AS "函數(shù)名稱" , pg_type.typname AS "返回值數(shù)據(jù)類型" , pg_proc.pronargs AS "參數(shù)個數(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ù)個數(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ā)器是數(shù)據(jù)庫自動執(zhí)行\(zhòng)指定的數(shù)據(jù)庫事件發(fā)生時調(diào)用的回調(diào)函數(shù)。以下是有關PostgreSQL的觸發(fā)器的要點: www.yiibai.com
PostgreSQL的觸發(fā)可以指定觸發(fā)操作前嘗試一行(在檢查約束之前INSERT,UPDATE或DELETE)或操作完成后(在檢查約束之后和INSERT,UPDATE或DELETE(刪除)已完成),或替代的操作(在視圖上插入,更新或刪除的情況下)..
FOR EACH ROW觸發(fā)器被標記的操作修改的每一行被稱為一次。相比之下,F(xiàn)OR EACH STATEMENT觸發(fā)器為只執(zhí)行一次對于任何給定的操作,不管它有多少行修改。
WHEN子句和觸發(fā)器動作可能訪問的行元素被插入,刪除或更新使用的形式NEW.column-name和OLD.column-name,其中列名是從表中的列名的引用該觸發(fā)器相關聯(lián)的。 www.yiibai.com
如果提供WHEN子句,PostgreSQL的報表只執(zhí)行WHEN子句為true的行。如果沒有提供WHEN子句,PostgreSQL的語句執(zhí)行的所有行。
如果有多個相同類型的觸發(fā)器定義了相同的事件,他們將被觸發(fā)名稱是按字母順序排列。
BEFORE,AFTER或INSTEAD OF關鍵字決定何時觸發(fā)動作將被執(zhí)行,相對于插入,修改或移除相關的行。www.yiibai.com
觸發(fā)器表,它們與丟棄時自動刪除。 yiibai.com
要修改的表必須存在,在同一數(shù)據(jù)庫中的表或視圖,觸發(fā)器被附加,必須使用表名而不使用database.tablename。
約束時指定的選項創(chuàng)建一個約束觸發(fā)器。這是一個普通的觸發(fā)器除外,可以調(diào)整使用SET(設定)約束的觸發(fā)器觸發(fā)的定時相同。預計約束觸發(fā)器違反他們所實施的限制時引發(fā)異常..
語法:
創(chuàng)建觸發(fā)器的基本語法如下:
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表中的每一條記錄被插入,我們將創(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);
為了保持審核的測試,我們將創(chuàng)建一個新的表被稱為審計將被插入日志消息每當有一個新的記錄條目表COMPANY:www.yiibai.com
testdb=# CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL);
這里的ID是審計記錄ID,EMP_ID的ID來自COMPANY表,日期將保持公司表時的記錄將被創(chuàng)建時間戳。所以,現(xiàn)在讓我們創(chuàng)建一個觸發(fā)器,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;
現(xiàn)在,讓我們開始COMPANY 表插入記錄,這將導致在審核表中創(chuàng)建審計日志記錄。因此,讓我們創(chuàng)建一個COMPANY 表記錄如下:
testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );
這將創(chuàng)建一個記錄COMPANY 表如下: yiibai.com
id | name | age | address | salary
----+------+-----+--------------+--------
1 | Paul | 32 | California | 20000
同時審核表中創(chuàng)建一條記錄。這條記錄是一個觸發(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ā)器
可以列出當前數(shù)據(jù)庫中的所有觸發(fā)器從pg_trigger表如下:
testdb=# SELECT * FROM pg_trigger;
或者
select trigger_name from information_schema.triggers;
以上PostgreSQL的表會列出所有觸發(fā)器。
如果要列出特定表上的觸發(fā)器,然后使用條款與表名如下:
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
以上PostgreSQL的表也會列出只有一個條目如下:
tgname
-----------------
example_trigger
(1 row)
刪除觸發(fā)器
以下是DROP命令可以用來刪除一個現(xiàn)有的觸發(fā): yiibai.com
testdb=# DROP TRIGGER trigger_name on tablename;
1、進入數(shù)據(jù)庫終端
psql 數(shù)據(jù)庫名 -U 用戶名
2、查看所有的數(shù)據(jù)庫名
\l或者\list
以上是“postgresql開發(fā)中可能有用的知識有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。