2017-03-24 33 views
1

行は影響しない競合が-ことができ、私はDATA_IDpostgresqlの私はテーブルを持っている二度目

に自動ナンバリング/配列を有し
tabledata 
--------- 
data_id [PK] 
data_code [Unique] 
data_desc 

コード例:

insert into tabledata(data_code,data_desc) values(Z01,'red') 
on conflict (data_code) do update set data_desc=excluded.data_desc 

が正常に動作し、その後、私は挿入再び

insert into tabledata(data_code,data_desc) values(Z01,'blue') 
on conflict (data_code) do update set data_desc=excluded.data_desc 

私はこのエラーを得た

[Err] ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values.

これは私の実際のコード

insert into psa_aso_branch(branch_code,branch_desc,regional_code,status,created_date,lastmodified_date) 
    (select branch_code, branch, kode_regional, 
    case when status_data='Y' then true 
    else false end, current_date, current_date 
    from branch_history) on conflict (branch_code) do 
    update set branch_desc = excluded.branch_desc, regional_code = excluded.regional_code,status = (case when excluded.status='Y' then true else false end), created_date=current_date, lastmodified_date=current_date; 

最初に細かい作業ではなく、次のものである(例のように、私は前にあなたを与える)

+0

「data_desc」が唯一の一意の属性ではないため、なぜあなたは 'set data_desc = excluded.data_desc'ですか? –

+1

クエリに構文エラーがあり、同じテーブル。これらを修正した後、彼らは働いています:http://rextester.com/NMCXR16182 - しかし、エラーメッセージはあなたが異なるものを実行していることを示唆しています:http://stackoverflow.com/questions/35949877/how-to-include -excluded-rows-in-conflict-on-conflict-on-on-conflictのコード – pozs

+1

はすでにコードを編集していますが、リンク上ではうまく動作しますが、私のコードは実際には少し異なりますが、 –

答えて

1

あなたが既存のレコード/行の更新をない使用することができますあなたは挿入しています。 ここで、on conflict句は、除外テーブルの行に適用されます。行を一時的に保持しています

data_codeには衝突がないため、最初のケースが挿入されます。更新はまったく実行されません

2番目の挿入では、すでにdata_codeとして挿入されていて、data_codeが一意であるZ01を挿入しています。

除外テーブルには、更新後もdata_codeの重複値が保持されます。したがって、記録されたものは挿入されません。更新セットでレコードを正しく挿入するためにdata_codeを変更する必要があります

+0

「あなたはレコードを挿入していないので、そこからdata_descを更新できません。それを修正する方法は? –

+0

私はより正確に見て私の答えを変更しました –

関連する問題