PostgreSQL中實現更新默認值(二)


今天我們用表繼承+觸發器的方案,來實現表中的更新默認值。這也許是PostgreSQL里最佳的解決方案。

一. 創建一張表,作為父表

create table basic_update
(
t_update timestamp
);

二. 創建一個函數,用作最后負責修改t_update使用

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.t_update = now();
RETURN NEW;
END;
$$
language 'plpgsql';

三. 創建一個函數,用來給繼承了basic_update的表新增一個觸發器,懟上第二步的函數

create function table_create()
returns event_trigger
language plpgsql
as $$
DECLARE oid INT;
table_name VARCHAR;
parent_tables VARCHAR [];
is_update BOOL;

BEGIN

SELECT object_identity
INTO table_name FROM pg_event_trigger_ddl_commands();

SELECT objid
INTO oid FROM pg_event_trigger_ddl_commands();


SELECT get_parent_tables_by_oid(oid)
INTO parent_tables;

大專欄  PostgreSQL中實現更新默認值(二) SELECT parent_tables :: TEXT [] @> '{basic_update}' :: TEXT []
INTO is_update;


IF is_update

THEN
EXECUTE 'CREATE TRIGGER tgr_auto_t_update'
|| ' BEFORE UPDATE ON '
|| table_name
|| ' FOR EACH ROW EXECUTE PROCEDURE update_modified_column()';
END IF;

END;

四. 創建一個建表時的觸發器,接管創建表的時機,懟上第三步的函數

CREATE EVENT TRIGGER etgr_table_create
ON ddl_command_end
WHEN TAG IN ('CREATE TABLE')
EXECUTE PROCEDURE table_create();

五. 所有操作已經完成,可以創建一個表測試了

create table test
(
id varchar default uuid_generate_v4() not null
constraint test_pkey
primary key,
text varchar,
t_create timestamp default now()
)
inherits (basic_update);
insert into test (text)
values ('a');
update test
set text = 'b'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM