oracle - 在 Oracle 中,使用单个查询将多行从一个表插入到另一个表中

标签 oracle sql-insert unique-constraint ora-00001

我有两个表,dcr_details_new 和 dcr_details_old,其中主键是 DCRDID。

enter image description here

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/

相关文章:

oracle - Oracle 中的多个 REPLACE 函数

逻辑操作数的 SQL 操作顺序

php - 如果插入成功则显示消息 PDO

hibernate - Postgres 唯一约束在 hibernate 中不可延迟

hibernate - 是否可以配置 Play Framework 的 CRUD 模块以遵守 @Column(unique=true) 注释?

.net - 使用 .NET 将数据加载到 ORACLE 数据库的最快方法是什么?

oracle - 如何在Oracle中按字段与字符串和数字混合排序?

sql - 如何插入包含撇号(单引号)的值?

php - 无法使用 PHP INSERT INTO 数据库,没有抛出错误

sql - PostgreSQL 8.3 中具有非空和唯一约束的增量字段