代理键的 INSERT ALL INTO 和 Sequence.nextval
Posted
技术标签:
【中文标题】代理键的 INSERT ALL INTO 和 Sequence.nextval【英文标题】:INSERT ALL INTO and Sequence.nextval for a Surrogate Key 【发布时间】:2011-12-03 19:20:45 【问题描述】:我正在尝试使用 INSERT ALL INTO 插入 40 行,但我不确定如何插入代理键。这就是我所拥有的
BEGIN
INSERT ALL
INTO question(question_id)
VALUES (question_seq.nextval)
END
现在,如果我添加另一个 INTO VALUES,那么我会违反唯一约束。
BEGIN
INSERT ALL
INTO question(question_id)
VALUES (question_seq.nextval)
INTO question(question_id)
VALUES (question_seq.nextval)
END
如何更新每个 INTO VALUES 的序列 nextval 值,以避免违反唯一约束?我假设 nextval 会自动更新自己。
更新:我不知道这是否是处理此问题的最佳方法,但这是我想出的解决方案:
首先我创建了一个返回值的函数 然后我在 VALUES 子句的 id 字段中调用了该函数
create or replace
FUNCTION GET_QUESTION_ID RETURN NUMBER AS
num NUMBER;
BEGIN
SELECT UHCL_QUESTIONS_SEQ.nextval
INTO num
FROM dual;
return num;
END GET_QUESTION_ID;
INSERT ALL
INTO question(question_id)
VALUES (GET_QUESTION_ID())
INTO question(question_id)
VALUES (GET_QUESTION_ID())
【问题讨论】:
您的insert all
不需要from
子句吗?
@Raihan 不适合全部插入。
@Raihan 对此感到抱歉...你是对的,我只是没有粘贴选择,但我有一个。
【参考方案1】:
由于具有 SQL Server 背景,我总是在表上创建一个触发器,以基本上模拟 IDENTITY 功能。触发后,SK 会自动从序列中生成,就像身份一样,您不必担心。
【讨论】:
【参考方案2】:你可以这样使用:
insert into question(question_id)
select question_seq.nextval from
(
select level from dual connect by level <= 40
);
虽然这不是一种很方便的格式,尤其是当您要添加其他列时。您可能需要创建另一个 UNION ALL
查询,并通过 LEVEL
或 ROWNUM
加入它。
我的第一个想法是做这样的事情:
insert into question(question_id)
select question_seq.nextval value from dual
union all
select question_seq.nextval from dual;
但由于restrictions on sequence values,它会生成ORA-02287: sequence number not allowed here
。
顺便问一下,您确定您的INSERT ALL
可以在没有子查询的情况下工作吗?我收到错误ORA-00928: missing SELECT keyword
,来自 11.2 manual 的图表暗示必须有一个子查询:
【讨论】:
【参考方案3】:我不知道这是否是处理此问题的最佳方法,但这是我想出的解决方案:
首先我创建了一个返回值的函数 然后我在 VALUES 子句的 id 字段中调用了该函数
create or replace
FUNCTION GET_QUESTION_ID RETURN NUMBER AS
num NUMBER;
BEGIN
SELECT UHCL_QUESTIONS_SEQ.nextval
INTO num
FROM dual;
return num;
END GET_QUESTION_ID;
INSERT ALL
INTO question(question_id)
VALUES (GET_QUESTION_ID())
INTO question(question_id)
VALUES (GET_QUESTION_ID())
【讨论】:
以上是关于代理键的 INSERT ALL INTO 和 Sequence.nextval的主要内容,如果未能解决你的问题,请参考以下文章
“INSERT INTO ... FETCH ALL FROM ...”无法编译
Oracle中insert into select和select into的区别