Oracle一次插入多条记录时,如何给定主键?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle一次插入多条记录时,如何给定主键?相关的知识,希望对你有一定的参考价值。

我要向表T(id,a,b,c)中一次插入多条子查询的记录,语句如下
insert into T
select (a, b, c) from ("子查询获得的结果")
现在的问题是,这条语句没有给定T的id,T的id由Sequence s取得。
求高手解答!!!在线等!!万分感激!!
我只有5点财富了,实在抱歉!!

通过你的描述:
解决方案一:你可以设置一个sequence,然后这个sequence的主要作用就是每次插入的时候 id的字段值设置成next_val;这样就可以实现简单的主键。
解决方案二:你还可以设置id的形式为uuid(32个字节长度)。这个能保证每次的输入值唯一
参考技术A 给你思路:
查看下T主键ID的当前SEQUANCE值,或用select max(id) from T,得到当前序列号值为x
然后在子查询中用rownum+x方式
insert into T select (rownum+x,a,b,c) from ……
完成后重建或者空选下sequence避免后续调用时出现问题追问

你的思路非常棒,很有帮助!但是我只能写一条SQL语句,然后把语句交给DBA用Oracle的Job来定时执行,我估计DBA不会帮我每次都重建Sequence……泪奔!!!
还有别的办法么????

追答

定义job时完全可以执行或调用存储过程,和DBA交涉下
建议你按照思路写好代码做到存储过程,让DBA在JOB中执行你的存储过程

追问

我已经搞定啦!向DBA请教了下,其实很简单,这样写就好了
insert into T(id, a, b, c)
select (seq_t.nextval), a, b, c from ("子查询获得的结果")
注意这里直接写seq_t.nextval就好了,不能写select seq_t.nextval from dual。我之前就是这样报错了,所以以为用Sequence行不通,呵呵!
很感谢你的热心帮助!!

追答

解决了就好:)

本回答被提问者采纳
参考技术B 这个恐怕不行的,如果真的没有指定的话,可以追加一个Trigger ,on inster Each Row方式。
写上 :new.id = s.nextval;

就可以了追问

谢谢!但是DBA不会帮我加触发器的……

参考技术C insert into t (id,a,b,c) select s.nextval,a,b,c from ("子查询获得的结果");追问

谢谢!我已经试过了,这个方法不行……提示说“此处不能使用序列”……

追答

那就把你的那个子查询获得的结果的sql贴出来

追问

我已经解决了,解决办法我在一楼有说,非常感谢!!!

追答

你的解决办法不和我的一样吗

追问

额,是的……我之前写的是select seq_t.nextval from dual,报错,以为用序列行不通,然后看到你的方法也是用序列,觉得也不行,所以……现在回过头来看,才发现原来你的是正确的。实在不好意思,不然就选你了,Sorry……

如何在oracle数据表中一次性插入多条记录?

参考技术A 看是什么样子的插入法。
如果是从其他的表导入那么用insert
into+表名(字段)(字段入围全部可以不写)+as
select+字段+from+数据来源表名
where+条件;(注意:前后字段顺序一致)
如果从外部表导入,那么就没什么问题sqllar导入。
如果是需要手动的输入,那么我建议就建立外部表,然后用sqllar去倒,可以每次输入都同时输入一张外部表,然后用sqllar导入,这样就可以了。

以上是关于Oracle一次插入多条记录时,如何给定主键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle数据表中一次性插入多条记录?

如何在oracle数据表中一次性插入多条记录?

使用顺序主键插入查询

如何使用 Node.js 将多条记录插入 Oracle DB

oracle Insert 一次插入多条记录

insert一次插入多条数据