簡體   English   中英

在SQL插入上,在事務期間,如何獲取新行中另一個字段的值以復制到另一個字段?

[英]On SQL Insert, during the transaction, how do I get the value of another field in this new row to copy to another field?

我有一張桌子,如下所示:

FORMS
----
form_id bigint NOT NULL DEFAULT id_generator(),
...
...
form_pretty_url character varying NOT NULL DEFAULT 'form-'::*GET_FORM_ID*

id_generator函數從此處復制: http ://rob.conery.io/2014/05/29/a-better-id-generator-for-postgresql/

CREATE OR REPLACE FUNCTION id_generator(OUT result bigint) AS $$
DECLARE
    our_epoch bigint := 1314220021721;
    seq_id bigint;
    now_millis bigint;
    shard_id int := 5;
BEGIN
    SELECT nextval('insta5.table_id_seq') % 1024 INTO seq_id;
    SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
    result := (now_millis - our_epoch) << 23;
    result := result | (shard_id << 10);
    result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;

調用last_value或currval(),lastval()或任何其他可用函數不會返回我想要的內容。

使用的數據庫是PostgreSQL。

列的默認值不能引用另一列。 有一個特定的錯誤消息:

=> create table tst(i int, j int default i);
ERROR:  cannot use column references in default expression

您可以使用BEFORE INSERT觸發器來獲得所需的結果。 由於該列上存在一個NOT NULL約束,因此它仍需要一個非null的默認值,因為已檢查了該約束並且該約束必須在運行觸發器之前有效。

定義的改變:

 form_pretty_url character varying NOT NULL DEFAULT '';

觸發示例:

CREATE FUNCTION trigfunc() RETURNS TRIGGER as $$
BEGIN
  IF NEW.form_pretty_url = '' THEN
     NEW.form_pretty_url := 'form-' || NEW.form_id::text; 
  END IF;
  RETURN NEW;
END $$ language plpgsql;


CREATE TRIGGER trigname BEFORE INSERT  ON tablename
  FOR EACH ROW EXECUTE PROCEDURE trigfunc();

暫無
暫無

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

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