5 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;
Run Code Online (Sandbox Code Playgroud)
Ale*_*ole 16
- 您不能在多表插入语句的任何部分中指定序列.多表插入被视为单个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
Run Code Online (Sandbox Code Playgroud)
但那有点尴尬.你可能最好使用单独的insert语句 - 在单个表中使用多表插入并不是真正获得了很多 - 或者是从序列中设置唯一列的触发器,或者是CTE /内联视图来生成值插入.
您无需修改数据库对象,只需将多表重写为具有通过以下方式连接的多行的INSERT ALL单个表:INSERTUNION ALL
INSERT INTO postal_code
SELECT postal_code_seq.NEXTVAL, description
FROM
(
SELECT 'Coimbatore' description FROM dual UNION ALL
SELECT 'Mumbai' description FROM dual
);
Run Code Online (Sandbox Code Playgroud)
请注意,必须在外部查询中调用该序列。在内部查询中使用序列看起来可以简化代码,但会引发错误“ORA-02287:此处不允许序列号”。