在Oracle中按顺序插入多行
这是我用于在oracle数据库中插入多行的查询。但当我在其中使用序列时,它会引发错误ORA-00001:唯一约束。怎么做在Oracle中按顺序插入多行,oracle,sequence,multiple-insert,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 DU
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;
尝试在oracle数据库中插入此多行
INTO POSTAL_CODE (postal_code,desc)
VALUES(&postal_code,&desc) SELECT * FROM DUAL;
将全部插入邮政编码(邮政编码,描述)值(邮政编码.NEXTVAL,&desc)插入邮政编码(邮政编码,描述)值(邮政编码.NEXTVAL,&desc)从双精度选择* 我将使用before insert触发器来填充键列(如果insert没有提供值),而不是使用此方法。序列与多表插入不兼容。包括:
- 不能在多表insert语句的任何部分指定序列。多表插入被视为单个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
但这有点尴尬。您最好使用单独的insert语句—在单个表中使用多任务insert实际上并没有获得多少好处—或者使用触发器从序列中设置唯一列,或CTE/内联视图来生成要插入的值。无需修改数据库对象,您只需将多表
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:此处不允许使用序列号”。在哪里设置替换变量?在哪里设置替换变量?这并不能解决整个语句只递增一次的
nextval
问题,这是唯一约束冲突的原因。在将代码作为答案的一部分发布时,您应该包含解释代码尝试执行的操作以及如何解决问题中描述的问题的文本。目前来看,这不是一个有用的答案。