我有两个表,dcr_details_new 和 dcr_details_old,其中主键是 DCRDID。
dcr_details_new 和 dcr_details_old 表共享相同的结构。主键是 DCRDID,我在每次插入时加一。
我需要将 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 进行过滤时,选择语句会返回许多记录,当我尝试循环并插入时,我总是搞乱主键,因为它没有按我希望的方式递增。
这是我尝试过的循环和我遇到的错误。
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表插入到具有新主键的new表中,请使用以下语句。
请注意,关键部分是获取最大的现有 key 并使用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'
;
关于oracle - 在 Oracle 中,使用单个查询将多行从一个表插入到另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33392766/