[英]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.