oracle中序列的相关问题,insert ...... select 报错
oracle中序列的相关问题,insert......select报错我现在有一个需求需要用存储过程往一个表中插入数据,主键使用序列。插入数据的语句格式是insertin...
oracle中序列的相关问题,insert ...... select 报错 我现在有一个需求需要用存储过程往一个表中插入数据,主键使用序列。插入数据的语句 格式是 insert into table1(id,zd1,zd2,zd3.....) select sequence_id.nextval, zd1,zd2,zd3...... from table2 这样执行会报错 此处不允许使用序号 如果 insert into table1(id,zd1,zd2,zd3.....) select (select nvl(max(id),0) from table1 ) +1 as id ,zd2,zd3...... from table2 执行完后插入id 列的值都是一样的。主键不唯一 。 insert into table1(id,zd1,zd2,zd3.....) select (select count(*) from table1 ) +1 as id ,zd2,zd3...... from table2 情况和上面一样 。现在想问一下,谁有没有更好的办法 除了使用游标一条一条的插入 。
展开
展开全部
语句语法应该没问题,我经常用这种方式插入,你在序列钱加入数据库OWNER名试试看,即
insert into table1(id,zd1,zd2,zd3.....) select 用户名.sequence_id.nextval, zd1,zd2,zd3...... from table2
不推荐用select nvl(max(id),0) from table1 ) +1,因为如果你中间有数据删除,ID就会重新排序,对历史数据,如果涉及到流程就会错乱了
insert into table1(id,zd1,zd2,zd3.....) select 用户名.sequence_id.nextval, zd1,zd2,zd3...... from table2
不推荐用select nvl(max(id),0) from table1 ) +1,因为如果你中间有数据删除,ID就会重新排序,对历史数据,如果涉及到流程就会错乱了
追问
这个表如果要设置联合主键得设置96个, 为了避免麻烦 所以设置一个 ID形式上的主键,所以ID号是不重要的。 这个表只是存储中间计算结果 ,下次计算就会基本上清空整张表。
展开全部
我测试 insert into t1(id) select seq_id.nextval from t2, 这个正常呀,你是不是子查询用了group by或order by?
追问
子查询很复杂 使用了GROUP BY
追答
Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the
following constructs:
■ A subquery in a DELETE, SELECT, or UPDATE statement
■ A query of a view or of a materialized view
■ A SELECT statement with the DISTINCT operator
■ A SELECT statement with a GROUP BY clause or ORDER BY clause
■ A SELECT statement that is combined with another SELECT statement with the
UNION, INTERSECT, or MINUS set operator
■ The WHERE clause of a SELECT statement
■ The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement
■ The condition of a CHECK constrain
你可以再包一层,如:
insert into t2 select t1.f1,t1.f2,...,t1.fn, seq.nextval from (你的查询) t1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
后两个sql肯定是不行的,没有commit之前,table1的max(id)和数量count(*)不会变的。
第一个sql感觉没有问题,能把报错的具体信息贴出来吗,另外sequence_id应该在建立存储过程之前就建好没有问题吧。
第一个sql感觉没有问题,能把报错的具体信息贴出来吗,另外sequence_id应该在建立存储过程之前就建好没有问题吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
insert into table1 select sequence_id.nextval,t.zd1,t.zd2,t.zd3... from (select zd1,zd2,zd3...from table2) t
这样呢?
更多追问追答
追问
问题出在我的子查询里使用了group by
追答
子x查询原本的语句发一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-01-15
展开全部
insert into table1(id,zd1,zd2,zd3.....) select (select count(*) from table1 ) +rownum as id ,zd2,zd3...... from table2
追问
插入数据的表会经常删除数据 这样做会导致 ID重复
(select nvl(max(id),0) from table1 ) + rownum 解决
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询