簡體   English   中英

如何在PostgreSQL中插入自動增量值作為觸發器?

[英]how to insert auto increment value for trigger in postgresql?

這是來自plpgsql的觸發器-

CREATE TABLE emp (
    empname           text NOT NULL,
    salary            integer
);

CREATE TABLE emp_audit(
    operation         char(1)   NOT NULL,
    stamp             timestamp NOT NULL,
    userid            text      NOT NULL,
    empname           text      NOT NULL,
    salary integer
);

CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
    BEGIN
        --
        -- Create a row in emp_audit to reflect the operation performed on emp,
        -- make use of the special variable TG_OP to work out the operation.
        --
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
            RETURN NEW;
        END IF;
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;
$emp_audit$ LANGUAGE plpgsql;

CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();

現在,我想在emp_audit表中再添加一列,這是一個主鍵,例如emp_audit_id因此,上面的SELECT查詢現在應該在這里顯示什么,以便它也可以處理PRIMARY KEY emp_audit_id

由於您不想在INSERT語句上寫出字段列表(其他讀者:請參見下面的注釋),因此需要使用常規integer作為PRIMARY KEY和手動創建的序列。

首先更改emp_audit表定義:

ALTER TABLE emp_audit ADD COLUMN emp_audit_id integer PRIMARY KEY

創建一個序列:

CREATE SEQUENCE seq_empaudit_pk;

INSERT語句中,添加序列中的下一個值:

IF (TG_OP = 'DELETE') THEN
    INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*, nextval(seq_empaudit_pk);
    RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
    INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*, nextval(seq_empaudit_pk);
    RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
    INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*, nextval(seq_empaudit_pk);
    RETURN NEW;
END IF;

更改表后,請確保驗證字段的順序,並按照該順序列出SELECT查詢中的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM