簡體   English   中英

Oracle:如果父表引用的列具有值,則自動填充外鍵

[英]Oracle : Autopopulate foreign key if parent table referenced column has values

這可能是一個愚蠢的問題,但不知何故我無法解決。

我有表statuslogs ,兩個表都有jobId列。 jobId是根據序列生成的,因此我想將sequence generated jobIdlogs表添加到status頁。

我在status表中創建了外鍵,該外鍵引用了logs表的jobId列,但jobId值未填充在status表中。

我怎樣才能自動填充jobIdstatus表時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 ,當你填充序列的jobIDstatus表。

在最簡單的情況下,您有兩個表和一個序列

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.

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