我有两个表,dcr_details_new和dcr_details_old,其中主键是DCRDID。
dcr_details_new表和dcr_details_old表共享相同的结构。主键是DCRDID,在每个插入中我将其递增1。
我需要将所有行从dcr_details_old提取到dcr_details_new中,在这里我必须按DOCREGNO和DCR_No过滤记录
因此,正常的单行导入/插入操作如下。
INSERT INTO dcr_details_new
SELECT (select Max(DCRDID) + 1 from dcr_details_new),
TWNCODE,
'100008',
DOCCATOGARY,
DCR_NO,
VISIT_NO,
GIVEAWAY,
COMPETITORBRN,
REMARK,
DCRDRDATE,
COM_ACTI
FROM dcr_details_old
WHERE DOCREGNO= 'T10037'
and DCR_NO = 28766;
1 rows created.
现在,我想跳过筛选dcr_no
并插入记录,因为它包含太多带有不同dcr_no
的记录。在这里,当我仅使用DOCREGNO
select语句进行过滤时,会返回许多记录,并且当我尝试循环执行和插入操作时,我总是会弄乱主键,因为它没有按我的意愿递增。
这是我尝试过的循环以及出现的错误。
declare
i integer := 1;
BEGIN
FOR x IN (select * from dcr_details_old WHERE DOCREGNO= 'T10037')
LOOP
INSERT INTO dcr_details_new (DCRDID, TWNCODE, DOCREGNO, DOCCATOGARY,
DCR_NO, VISIT_NO, GIVEAWAY, COMPETITORBRN,
REMARK, DCRDRDATE, COM_ACTI)
SELECT (select Max(DCRDID) + 1 from dcr_details_new),
TWNCODE,
'100008',
DOCCATOGARY,
DCR_NO, VISIT_NO, GIVEAWAY, COMPETITORBRN,
REMARK, DCRDRDATE, COM_ACTI
FROM dcr_details_old;
i := i + 1;
END LOOP;
END;
错误:
**ERROR at line 1:
ORA-00001: unique constraint (SYS_C0061873) violated
ORA-06512: at line 5**
此错误SYS_C0061873
是主键DCRDID
。在插入值中,这'100008'
是docregno
我必须手动输入的新值。
有任何简单的方法可以继续吗?请寻求您的协助。
要将具有新主键的所有记录从OLD表插入到新表,请使用以下语句。
注意,关键部分是获取最大的现有密钥并使用ROWNUM创建它。对于信号迁移步骤(即,不进行并行迁移且应用程序已关闭),这是一种安全的方法。
INSERT INTO dcr_details_new
(DCRDID,TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI)
select
(select max(DCRDID) from dcr_details_new) + rownum as DCRDID,
TWNCODE,DOCREGNO,DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
from dcr_details_old where DOCREGNO = 'T10037'
;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句