共計 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 行業資訊頻道!