00001. 00000 - “违反了唯一约束(%s。%s)”

时间:2014-03-06 12:04:32

标签: oracle plsql

我有MAIN_TABLE,它拥有700万条记录。我必须

  1. 将最近3个月的数据保留在MAIN_TABLE
  2. 归档MAIN_TABLE_ARCHIVAL
  3. 中的最近4到12个月的数据
  4. 清除所有超过12个月的数据
  5. 我使用游标创建了一个存储过程,以便从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。任何人都可以告诉我为什么会这样吗?我该如何实施上述任务?

2 个答案:

答案 0 :(得分:0)

要将数据从一个表复制到另一个表,您不需要任何光标。您甚至不需要存储过程。你可以用一个简单的sql语句来实现这个目的:

insert into MAIN_TABLE_ARCHIVAL select * from MAIN_TABLE where <...your condition...>

要提高性能,可以使用“+ append”提示。

答案 1 :(得分:0)

看看这个: Unique constraint violation during insert: why? (Oracle)

将序列中的起始值与表格中的MAX(ID)进行比较。

SELECT MAX(ID_Column) FROM Schema.Table; SELECT Schema.Table_Sequence.nextval from DUAL;