【问题标题】:how to batch insert with auto_increase id using oracle如何使用 oracle 批量插入 auto_increase id
【发布时间】:2019-07-30 08:47:48
【问题描述】:

批量往oracle插入数据,id变大了,怎么处理?我使用下面的sql都失败了。

insert into USER_MULTIVALUED_ATTRIBUTES (ATTRIBUTEID, ORGANIZATIONID, 
ENTRYUUID,ATTRIBUTENAME, ATTRIBUTETYPE, ATTRIBUTESTATUS, ATTRIBUTEVALUE,
                                     USERBUCKETID)
(SELECT SEQ_MAMULTIVALUEDATTRIBUTES.NEXTVAL ,'1','1','1','1','1','1',1  FROM 
DUAL) union all (SELECT SEQ_MAMULTIVALUEDATTRIBUTES.NEXTVAL 
,'1','1','1','1','1','1',1 FROM DUAL)

另一个

INSERT ALL
INTO USER_MULTIVALUED_ATTRIBUTES
    (ATTRIBUTEID, ORGANIZATIONID, ENTRYUUID,ATTRIBUTENAME, ATTRIBUTETYPE, 
ATTRIBUTESTATUS, ATTRIBUTEVALUE,USERBUCKETID)
    VALUES(SEQ_MAMULTIVALUEDATTRIBUTES.NEXTVAL ,'1','1','1','1','1','1',1)

INTO USER_MULTIVALUED_ATTRIBUTES
    (ATTRIBUTEID, ORGANIZATIONID, ENTRYUUID,ATTRIBUTENAME, ATTRIBUTETYPE, 
ATTRIBUTESTATUS, ATTRIBUTEVALUE,
     USERBUCKETID)
VALUES( SEQ_MAMULTIVALUEDATTRIBUTES.NEXTVAL,'1','1','1','1','1','1',1)
    SELECT 1 FROM DUAL

第一个 sql 错误:这里不能使用序列

第二个sql错误:违反唯一约束

甲骨文 11g

【问题讨论】:

标签: sql oracle oracle11g sql-insert


【解决方案1】:

您不需要UNION ALL,使用带有CONNECT BY LEVEL 子句的SELECT 语句:

INSERT INTO USER_MULTIVALUED_ATTRIBUTES (ATTRIBUTEID, ORGANIZATIONID, 
ENTRYUUID,ATTRIBUTENAME, ATTRIBUTETYPE, ATTRIBUTESTATUS, ATTRIBUTEVALUE, USERBUCKETID)
SELECT SEQ_MAMULTIVALUEDATTRIBUTES.NEXTVAL ,'1','1','1','1','1','1',1  
  FROM DUAL
CONNECT BY LEVEL <= N; --where N is a constant value which represents the number of rows to be inserted.

您甚至可以更喜欢使用 LEVEL 伪列而不是 SEQ_MAMULTIVALUEDATTRIBUTES.NEXTVAL 作为从 1 开始递增的整数值。

【讨论】:

    【解决方案2】:

    如果这是实际问题,那么@Barbaros Özhan 已经给出了完美的答案。

    但是,如果这只是一个示例并且在您的情况下使用 connect by 不可行,那么您可以使用 deterministic function OR 如果在您的情况下创建函数不可行,那么您可以在这种情况下,只要您需要NEXTVAL of Sequence,请使用以下内容。

    to_number(xmlquery('/ROWSET/ROW/C/text()'
        passing xmltype(dbms_xmlgen.getxml(
          'select <YOUR_SEQUENCE_NAME>.nextval as c '
          || 'from dual'))
      returning content))
    

    所以你的代码如下所示:

    INSERT INTO USER_MULTIVALUED_ATTRIBUTES (
        ATTRIBUTEID,
        ORGANIZATIONID,
        ENTRYUUID,
        ATTRIBUTENAME,
        ATTRIBUTETYPE,
        ATTRIBUTESTATUS,
        ATTRIBUTEVALUE,
        USERBUCKETID
    )
        ( SELECT
            to_number(xmlquery('/ROWSET/ROW/C/text()'
            passing xmltype(dbms_xmlgen.getxml(
              'select SEQ_MAMULTIVALUEDATTRIBUTES.nextval as c '
              || 'from dual'))
          returning content)), -- Same for the case in INSERT ALL
            '1',
            '1',
            '1',
            '1',
            '1',
            '1',
            1
        FROM
            DUAL
        )
        UNION ALL
        ( SELECT
            SEQ_MAMULTIVALUEDATTRIBUTES.NEXTVAL,
            '1',
            '1',
            '1',
            '1',
            '1',
            '1',
            1
        FROM
            DUAL
        );
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      相关资源
      最近更新 更多