![](/img/trans.png)
[英]PostgreSQL Calculated Column with values of another table referenced by foreign key
[英]Oracle : Autopopulate foreign key if parent table referenced column has values
這可能是一個愚蠢的問題,但不知何故我無法解決。
我有表status
和logs
,兩個表都有jobId
列。 jobId
是根據序列生成的,因此我想將sequence generated jobId
從logs
表添加到status
頁。
我在status
表中創建了外鍵,該外鍵引用了logs
表的jobId
列,但jobId值未填充在status
表中。
我怎樣才能自動填充jobId
在status
表時jobId
在自動生成的logs
使用序列?
更新
<id name="jobid"
column="JOBID"
type="long"
unsaved-value="-1">
<generator class="native">
<param name="sequence">ID_SEQ</param>
</generator>
</id>
這是如何為status
頁生成ID,如建議的那樣,我需要使用ID_SEQ.curval,但是我該如何在休眠狀態下執行此操作?
就像是
<id name="id"
column="ID"
type="long"
unsaved-value="-1">
<generator class="native">
<param name="sequence">ID_SEQ.curval</param>
</generator>
</id>
思考?
在日志表中插入行后,只需使用currval
:
insert into logs (jobid) values (seq_jobid.nextval);
insert into status (jobid) values (seq_jobid.currval);
這取決於你如何使用序列填充此列,但最有可能要使用currval
,當你填充序列的jobID
在status
表。
在最簡單的情況下,您有兩個表和一個序列
SQL> create table logs(
2 jobID number primary key
3 );
Table created.
SQL> create table status (
2 jobID number references logs(jobID)
3 );
Table created.
SQL> create sequence jobID_seq;
Sequence created.
插入logs
,使用序列的nextval
;插入status
,使用序列的currval
。 currval
為您的會話提供了最新的值,因此不會有其他會話獲得的currval
SQL> insert into logs values( jobID_seq.nextval );
1 row created.
SQL> insert into status values( jobID_seq.currval );
1 row created.
SQL> select * from logs;
JOBID
----------
5
SQL> select * from status;
JOBID
----------
5
如果您使用觸發器(我在這里使用11g語法-如果您使用的是舊版本,則可以使用SELECT jobID_seq.nextval into :new.jobID from dual
語法將舊的SELECT jobID_seq.nextval into :new.jobID from dual
)
SQL> create trigger trg_logs
2 before insert on logs
3 for each row
4 begin
5 :new.jobID := jobID_seq.nextval;
6 end;
7 /
Trigger created.
SQL> create trigger trg_status
2 before insert on status
3 for each row
4 begin
5 :new.jobID := jobID_seq.currval;
6 end;
7 /
Trigger created.
不過,我不太確定嘗試自動填充這樣的外鍵是否真的有意義。 大概在某些情況下,例如,您會將行添加到子表中,而不只是插入父行。 也許您可以通過在status
表的觸發器上添加IF
條件來解決該問題,該條件用於檢查是否已經提供了非NULL值
create trigger trg_status
before insert on status
for each row
begin
if( :new.jobID IS NULL )
then
:new.jobID := jobID_seq.currval;
end if;
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.