2

我有两个表,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的记录。在这里,当我仅使用 DOCREGNOselect 语句进行过滤时,会返回许多记录,而当我尝试循环并插入时,我总是会弄乱主键,因为它没有按我的意愿递增。

这是我尝试过的循环和我得到的错误。

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我必须手动输入的新值。

有什么简单的方法可以继续吗?请寻求您的帮助。

4

4 回答 4

1

要将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'
 ;
于 2015-10-28T14:35:46.413 回答
1

我认为这个变体适合你。

declare
 v_DCRDI number;
begin
select Max(DCRDID)+1 into v_DCRDI from dcr_details_new;
INSERT INTO dcr_details_new 
SELECT v_DCRDI+rownum DCRDI, TWNCODE,'100008',DOCCATOGARY,
DCR_NO,VISIT_NO,GIVEAWAY,COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
FROM dcr_details_old  
WHERE DOCREGNO= 'T10037' /*and DCR_NO = 28766*/;
end;
于 2015-10-28T14:41:33.440 回答
0

我很确定您所追求的只是一个插入语句,如下所示:

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,
         twncode,
         '100008',
         doccatogary,
         dcr_no,
         visit_no,
         giveaway,
         competitorbrn,
         remark,
         dcrdrdate,
         com_acti
  FROM   dcr_details_old;

通常,使用“max(val) + some_val”生成新的主键值是个坏主意。如果这是一个仅由发布脚本插入的静态数据表,那么它几乎可以接受。就个人而言,我还是宁愿使用序列!

我强烈建议您创建一个起始值为当前 max val + 1(或其他值)的序列,然后new_seq.nextval在向表中添加行时使用。简单得多,而且更万无一失!

于 2015-10-28T14:35:02.927 回答
0

在您的所有帮助之后,这是对我有用的最终答案。

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,'100008',DOCCATOGARY,DCR_NO,VISIT_NO,GIVEAWAY,
COMPETITORBRN,REMARK,DCRDRDATE,COM_ACTI
from dcr_details_old where DOCREGNO = 'T10037' ;

谢谢大家

于 2015-10-29T03:41:16.383 回答