我有MAIN_TABLE,它包含700萬條記錄。我不得不00001. 00000 - 「唯一約束(%s。%s)違反」
- 保持最近3個月的數據在MAIN_TABLE
- 歸檔過去的4至12個月的數據中MAIN_TABLE_ARCHIVAL
- 清除所有數據早於12個月
我創建了一個存儲過程一個從MAIN_TABLE複製到MAIN_TABLE_ARCHIVAL的遊標。我有複合主鍵(CONSTRAINT「PK_MAIN_TABLE」PRIMARY KEY(「SERVICE」,「TR_SOURCE」,「TR_ID」)
複製時我得到00001. 00000 - 「唯一約束(%s。%s)違反「即使我沒有插入任何重複鍵,但在同一時間記錄錯誤會被複制到MAIN_TABLE_ARCHIVE
我的代碼是這樣(我有大約20場,所以我不粘貼整個代碼):
DECLARE
c_id customers.id%type;
c_name customers.name%type;
c_addr customers.address%type;
CURSOR c_customers is
SELECT id, name, address FROM customers;
BEGIN
OPEN c_customers;
LOOP
FETCH c_customers into c_id, c_name, c_addr;
EXIT WHEN c_customers%notfound;
dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
commit;
END LOOP;
CLOSE c_customers;
END;
/
我試圖調試,但沒有運氣,因爲我是PL/SQL新手。請問任何人可以告訴我爲什麼會發生這種情況? e以上任務?
確定嗎?即使對於具有日誌追加功能的表,也會將數據放入新擴展區,有時甚至會比通常的插入更快。 –
該任務的最有效解決方案將使用分區。如果兩個表均按月分區,則可以通過交換分區(不包括任何數據移動)將數據從一個表移動到另一個表。但我認爲這樣的解決方案對於新手來說太複雜了。 –
MAIN_TABLE由大約800萬條記錄組成。如果我們使用簡單的insert into - select * from - 語句,會不會有任何性能問題。我讀過關於批量複製的地方會提高性能。我們也可以實現所有三個1)保留最近3個月的數據在MAIN_TABLE 2)存檔最後4到12個月的數據MAIN_TABLE_ARCHIVAL 3)通過在上面的語句中添加一些條件清除所有超過12個月的數據。 – vkreddy