在Oracle中插入带序列的多行

时间:2015-08-12 14:27:10

标签: oracle sequence multiple-insert

这是我用于在oracle数据库中插入多行的查询。但是当我在其中使用序列时,它会引发错误,如ORA-00001:唯一约束。怎么做。

INSERT ALL
  INTO POSTAL_CODE( postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Coimbatore')
  INTO POSTAL_CODE (postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Mumbai') SELECT * FROM DUAL;

5 个答案:

答案 0 :(得分:14)

restrictions on multitable inserts包括:

  
      
  • 您无法在多表插入语句的任何部分中指定序列。多表插入被视为单个SQL语句。因此,对NEXTVAL的第一次引用会生成下一个数字,并且语句中的所有后续引用都会返回相同的数字。
  •   

这不是真的 - 你可以使用一个序列,它总是得到相同的值,所以通过引用相同的序列一次创建父记录和子记录会很有用。

如果您想继续使用insert all 可以通过使用获取序列值的非确定性函数来解决这个问题:

CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
  RETURN postal_code_seq.nextval;
END;
/

INSERT ALL
  INTO POSTAL_CODE( postal_code,description)
    VALUES(get_seq,'Coimbatore')
  INTO POSTAL_CODE (postal_code,description)
    VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;

2 rows inserted.

SELECT * FROM postal_code;

                            POSTAL_CODE DESCRIPTION        
--------------------------------------- --------------------
                                      1 Coimbatore          
                                      2 Mumbai              

但这有点尴尬。您可能最好使用单独的插入语句 - 在单个表中使用多表插入并不是真正获得了很多 - 或者是从序列中设置唯一列的触发器,或CTE /内联视图生成要插入的值。

答案 1 :(得分:3)

我会使用before insert触发器填充键列(如果插件没有提供任何值)而不是此方法。序列不适用于多表插入。

答案 2 :(得分:2)

您无需修改​​数据库对象,而只需将多表INSERT ALL重写为单个INSERT,其中多行由UNION ALL连接:

INSERT INTO postal_code
SELECT postal_code_seq.NEXTVAL, description
FROM
(
    SELECT 'Coimbatore' description FROM dual UNION ALL
    SELECT 'Mumbai'     description FROM dual
);

请注意,必须在外部查询中调用该序列。在内部查询中使用序列看起来可以简化代码,但会引发错误“ ORA-02287:此处不允许序列号”。

答案 3 :(得分:-3)

INSERT ALL INTO POSTAL_CODE(postal_code,desc)VALUES(postal_code.NEXTVAL,& desc)INTO POSTAL_CODE(postal_code,desc)VALUES(postal_code.NEXTVAL,& desc)SELECT * FROM DUAL;

答案 4 :(得分:-4)

尝试在oracle数据库中插入此多行

INTO POSTAL_CODE (postal_code,desc)
VALUES(&postal_code,&desc) SELECT * FROM DUAL;