2016-03-02 72 views
-1

我已經爲了插入根據匹配條件多行寫了下面的腳本:插入行到Oracle數據庫中沒有得到重複鍵錯誤

Insert 
Into RATE_HEADER_NEGOTIATED (RESORT, RATE_CODE, NAME_ID, BEGIN_DATE, END_DATE, 
    INSERT_USER, INSERT_DATE, UPDATE_USER, UPDATE_DATE, ORDER_BY) 
(SELECT 'HRHLC','ST20B',NAME_ID,'01-JAN-2016','12-FEB-2016', 
    '327','12-FEB-2016','327','12-FEB-2016','1' 
from rate_header_negotiated 
where resort = 'HRHLC' 
and RATE_CODE = 'ST20BL' 
and RATE_CODE <> 'ST20B' 
and END_DATE >= '01-JAN-16'); 

我的問題是它給我重複鍵錯誤,因爲有已經是包含'ST20B'的行 - 我需要修復我的腳本的那部分內容,以便它只在不包含該ST20B的行上插入行。如果在運行它之前手動刪除重複行,腳本將起作用。

+2

那麼主鍵是什麼?請顯示錶格定義和所有唯一約束。 – OldProgrammer

+1

不要依賴您的NLS設置和隱式日期轉換;使用'to_date('01 -JAN-2016','DD-MON-YYYY')'或日期文字如'DATE'2016-01-01''。您似乎也將數字作爲字符串傳遞。表格的主要/唯一鍵是什麼? –

+0

主要唯一鍵是NAME_ID列,它是每個個人配置文件的標識符。所以基本上我想採取包含ST20BL的配置文件並複製該行,但插入ST20B。然而,其中一些NAME_ID確實已經擁有ST20B – DSmith

回答

1

如果第一個條件爲真,第二個必須是一樣,所以它是多餘的:

and RATE_CODE = 'ST20BL' 
and RATE_CODE <> 'ST20B' 

你似乎要排除那些與該值已連續,所以你需要一個not exists條款:

insert into RATE_HEADER_NEGOTIATED (RESORT, RATE_CODE, NAME_ID, BEGIN_DATE, 
    END_DATE,INSERT_USER, INSERT_DATE, UPDATE_USER, UPDATE_DATE, ORDER_BY) 
select 'HRHLC', 'ST20B', NAME_ID, DATE '2016-01-01', 
    DATE '2016-02-12', 327, DATE '2016-02-12', 327, DATE '2016-02-12', 1 
from rate_header_negotiated rhn 
where RESORT = 'HRHLC' 
and RATE_CODE = 'ST20BL' 
and END_DATE >= DATE '2016-01-01' 
and not exists (
    select null 
    from rate_header_negotiated 
    where RESORT = rhn.RESORT 
    and NAME_ID = rhn.NAME_ID 
    and RATE_CODE = 'ST20B' 
    -- any other key columns 
); 

你也可以做一個左連接或不中,但不-存在是很容易理解我的想法。

從Oracle 11gR2中,您可以use the IGNORE_ROW_ON_DUPKEY_INDEX hint而不是檢查密鑰的存在。您可能更喜歡這一點,或者可能更願意明確表示您期望並希望避免現有記錄。記錄錯誤也是可能的,但在這裏你似乎不需要。

我也更改爲使用日期文字,因此您不依賴於隱式轉換或會話NLS設置,並且刪除了數字周圍不正確的單引號,假設表格列中的數字是數字類型 - 從而避免進一步的隱式轉換。

+0

嗨亞歷克斯,非常感謝上述,我試了一下,它踢出了以下錯誤仍然:錯誤報告: SQL錯誤:ORA-00001:唯一約束(OPERA.RATE_HEADER_NEG_UK)違反 00001. 00000 - 「唯一約束(%s。%s)違反」 *原因:UPDATE或INSERT語句試圖插入重複鍵。 對於在DBMS MAC模式下配置的Trusted Oracle,如果重複條目存在於不同級別,則可能會看到此消息爲 。 *操作:刪除唯一限制或不要插入密鑰。 – DSmith

+0

RATE_HEADER_NEG_UK是(RESORT,RATE_CODE,NAME_ID)上的關鍵?爲該表及其所有鍵/索引添加DDL會很有幫助。 –

+0

無論如何都沒有表格,所以我不確定錯誤來自哪裏。我在抽取方面比插入更多的培訓 – DSmith

相關問題