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一次插入多条记录时,如何给定主键?的主要内容,如果未能解决你的问题,请参考以下文章