2016-12-08 3 views
0

タイトルは少し混乱することができます - 私は...深いダウン、ここで詳細になりますは、各タスクのためのOracleのテーブルに非ユニークキーの一意性を強制する方法を

単純化されたログテーブル想像:

run_id | step_id | result | 
-------------------------------- 
    1 |  1  | done | 
    1 |  2  | done | 
    1 |  3  | done | 
    1 |  4  | done | 
    2 |  1  | failed | 
    3 |  1  | done | 
    3 |  2  | done | 

しかし、同時に2つのジョブ(run_id 1と2)を実行すると、run_idを共有してしまいますが、これは正しくありません!!

は、私は明らかに..別々のIDを持っている各ジョブのためにしたい:)

オラクル(PL/SQL - ほとんどのパッケージ)にそれを強制する方法は非常に同じ時間(つまり、午前6時)から始まる仕事のため..

ご存知ですか?このような状況をどうやって解決するのですか?ユニークなインデックスを作成すると(run_id、step_id)どうすればいいですか? 「第2の」仕事は失敗するでしょうか?それとも自動的に値をインクリメントするのでしょうか?

SELECT nvl(max(run_id), 0)+1 INTO v_run_id 
FROM my_schema.log_table; 

これは、新しい値を取得し、コードです...しかし、それは

上記THX

EDITとしてので...と、動作しません:私は思っ回避策として 文字列と日付を使用して... START_DATEと文字列定数(代わりにRUN_IDのrun_name)を使用することについて...ので、表には、これは仕事ができる

run_name |  run_date   | step_id | result | 
-------------------------------------------------------- 
my_job#1 | 1/1/2016 7:00:00 AM | 1  | done | 
my_job#1 | 1/1/2016 7:00:00 AM | 2  | done | 
my_job#1 | 1/1/2016 7:00:00 AM | 3  | done | 
my_job#1 | 1/1/2016 7:00:00 AM | 4  | done | 
my_job#2 | 1/1/2016 7:00:00 AM | 1  | failed | 
my_job#1 | 1/2/2016 7:00:00 AM | 1  | done | 
my_job#1 | 1/2/2016 7:00:00 AM | 2  | done | 

のように見えることができます..私はちょうどCURていますIDでそれを行う方法

答えて

1

SELECT nvl(max(run_id), 0)+1 INTO v_run_id 
FROM my_schema.log_table; 

を私はステップごとに挿入するときに、あなたのコードは、その後run_idを使用していますと仮定します。

CREATE SEQUENCE run_id_seq; 

をそしてであなたの上記のクエリを置き換えます:あなたはこのようなシーケンスを作成する必要がありますあなたはすでにあなたのテーブル内の既存のデータを持っている場合は、あなたを作成するとき、あなたはSTART WITHに値が必要になる場合があります

SELECT run_id_seq.nextval FROM dual; 

シーケンスが衝突しないようにしてください。

+0

正確に:)偉大な...答えた!どうもありがとうございました –

0

これを処理するより良い方法は、シーケンスを使用することです。 Oracle 12cでは、generated always構成を使用して列に自動的に順次値を割り当てることができます(identityserial、およびauto_incrementなどのデータベース)。

古いバージョンでは、トリガーを使用してそれを維持します。トリガコードは次のようになり、テーブルの列と列を定義した後、:そのような構築物で

create trigger t_trigger 
before insert on t 
for each row 
begin 
    select seq.nextval into new.id 
    from dual; 
end; 

、値が同じになることはありません。あなたは現在、このようなRUN_ID取得され

+0

これは、各インサートごとに異なるrun_idが得られることを意味しますか? run_idで同じ「実行」を識別することはできません –

+0

@ Mr.Pはい。したがって、挿入された各行に対してトリガーを使用するのではなく、シーケンスから直接値を取得する必要があります。 –

関連する問題