代理键的 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 查询,并通过 LEVELROWNUM 加入它。

我的第一个想法是做这样的事情:

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的区别

Oracle中insert into select和select into的区别

自增列和insert into的问题

易语言 insert into

taradatainsertinto多行数据报错