0

これはばかげた質問かもしれませんが、どういうわけか私はそれを回避することができません。

私にはテーブルがstatusありlogs、両方のテーブルにjobId列があります。jobIdシーケンスに基づいて生成されるので、テーブルからページに追加sequence generated jobIdしたいと思います。logsstatus

テーブルへの列をstatus参照する外部キーをテーブルに作成しましたが、jobId値がテーブルに入力されていません。jobIdlogsstatus

シーケンスを使用して自動生成された場合jobId、どうすればstatusテーブルに自動入力できますか?jobIdlogs

アップデート

<id name="jobid"
        column="JOBID"
        type="long"
        unsaved-value="-1">
      <generator class="native">
            <param name="sequence">ID_SEQ</param>
        </generator>
    </id>

statusID_SEQ.curvalを使用する必要があることを示唆しているように、ページのIDを生成する方法は次のとおりですが、休止状態でそれを行うにはどうすればよいですか?

何かのようなもの

<id name="id"
        column="ID"
        type="long"
        unsaved-value="-1">
      <generator class="native">
            <param name="sequence">ID_SEQ.curval</param>
        </generator>
    </id>

考え?

4

2 に答える 2

2

currvalログテーブルに行を挿入した後に使用してください。

insert into logs (jobid) values (seq_jobid.nextval);
insert into status (jobid) values (seq_jobid.currval);
于 2012-07-03T14:56:43.373 に答える
2

シーケンスを使用してこの列にデータを入力する方法によって異なりますが、テーブルにデータを入力currvalするときにシーケンスのを使用する可能性があります。jobIDstatus

最も単純なケースでは、2つのテーブルと1つのシーケンスがあります

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を使用し、に挿入するときはシーケンスのを使用します。 セッションの最新の値を提供するため、他のセッションに与えられた値が表示されるリスクはありません。nextvalstatuscurrvalcurrvalcurrval

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ます。古いバージョンを使用している場合は、古い構文を使用できます)

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.

ただし、このような外部キーを自動的に入力しようとすることが本当に理にかなっているのかどうかはよくわかりません。たとえば、挿入しただけではない親行の子テーブルに行を追加する場合があります。おそらく、NULL以外の値がすでに提供されているかどうかを確認するIF条件をテーブルのトリガーに追加することで、これを回避できます。status

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;
于 2012-07-03T14:57:53.637 に答える