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

iswrvxsc  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(421)

我有一个MAIN_TABLE,它包含7百万条记录。
1.在MAIN_TABLE中保留最近3个月的数据
1.在MAIN_TABLE_ARCHIVAL中存档最近4到12个月的数据
1.清除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的新手。有人能告诉我为什么会发生这种情况吗?我应该如何实现上面的任务?

dm7nw8vv

dm7nw8vv1#

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

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

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

xqkwcwgp

xqkwcwgp2#

看看这个:Unique constraint violation during insert: why? (Oracle)
将序列中的起始值与表中的MAX(ID)进行比较。
SELECT MAX(ID_Column) FROM Schema.Table; SELECT Schema.Table_Sequence.nextval from DUAL;

相关问题