首页 > 解决方案 > ORACLE:在多插入时不使用序列创建唯一值

问题描述

有一个父表(MAIN_TABLE),需要对CHILD_TABLE各种类型(TYPE_1/TYPE_2/TYPE_3 等)的子表()进行多次插入。那是对于单亲记录,如果有三种类型,我将有三个孩子。

WITH MAIN_TABLE AS 
(
    SELECT 100 AS ID,'RICK' AS NAME,5 AS LINE FROM DUAL
    UNION ALL
    SELECT 101 AS ID,'TOM' AS NAME,6 AS LINE FROM DUAL
    )
SELECT * FROM MAIN_TABLE;
        ID NAME                       LINE
---------- -------------------- ----------
       100 RICK                          5
       101 TOM                           6

2 rows selected.

需要将父记录插入到子表中,其中column必须按递增顺序填充该行。

INSERT ALL
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_1')
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_2')
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_3')
  INTO CHILD_TABLE(ID, NAME, LINE, TYPE) 
    VALUES (ID, NAME, LINE, 'TYPE_4')
SELECT ID, NAME, LINE
  FROM MAIN_TABLE;  

SQL> SELECT * FROM CHILD_TABLE
       100 RICK                          5 TYPE_1    
       101 TOM                           6 TYPE_1    
       100 RICK                          5 TYPE_2    
       101 TOM                           6 TYPE_2    
       100 RICK                          5 TYPE_3    
       101 TOM                           6 TYPE_3    
       100 RICK                          5 TYPE_4    
       101 TOM                           6 TYPE_4    

8 rows selected.

在这里,我需要 5,6,7,8,9,10,11,12,而不是 5,6。如何解决这个问题?

注意: 1. 我无法创建序列 2. 如果可能,没有多个单独的插入语句。

标签: sqloracle

解决方案


我强烈建议尽可能使用 Oracle 序列。如果您仍然强烈需要不使用序列,请尝试构建伪序列表并编写一些 PLSQL 函数来通过选择可用序列 + 1 来执行插入。

或者你可以做类似的事情

为您当前的最大值创建一个变量并尝试使用ROW_NUMBER() OVER (ORDER BY column_name)+@your_varwhere@your_var= SELECT MAX(column_name) FROM child


推荐阅读