Chinaunix

标题: 从有主键的表select语句构造一个新的insert行? [打印本页]

作者: jeanlove    时间: 2009-04-01 14:37
标题: 从有主键的表select语句构造一个新的insert行?
如题,我知道可以通过子查询来创建新的记录。
insert into t(v1,v2,v3,v4......v50)
  select v1,v2,v3,...v50 from table where v3="abc"
有个问题:
select 到的v1是个primary key,所以上面这条语句失败了,主键冲突。

我的问题是:
如何从v3="abc"这条记录的数据行(D)作一个拷贝,把v1设置成D.v1+1,然后插入到数据库里面。

怎么修改这个insert语句? (Plus: 子查询select 后面不用再次写几十个字段的名字最好了,贴一大段字段名好累啊.....)

谢谢!
作者: freebarque    时间: 2009-04-01 14:37
可以用存储过程来做
declare
v_r   table%rowtype;
begin
select * into v_r from table where v3="abc";
v_r.v1 := v_r.v1+1;
insert into table values v_r;
end;

[ 本帖最后由 freebarque 于 2009-4-2 17:14 编辑 ]
作者: ziggler    时间: 2009-04-01 15:06
用SQL函数啊
作者: jeanlove    时间: 2009-04-01 16:29
原帖由 ziggler 于 2009-4-1 15:06 发表
用SQL函数啊

不用任何PLSQL的内容,使用纯sql,能做到么?
作者: zolwjz    时间: 2009-04-01 17:04
insert into t(v1,v2,v3,v4......v50)
  select v1+1 v1,v2,v3,...v50 from table where v3="abc"

注意 select 后面的 v1+1 v1。
作者: jeanlove    时间: 2009-04-01 17:16
原帖由 zolwjz 于 2009-4-1 17:04 发表
insert into t(v1,v2,v3,v4......v50)
  select v1+1 v1,v2,v3,...v50 from table where v3="abc"

注意 select 后面的 v1+1 v1。

这个insert可以工作,但是还有半个问题:

就是select子查询能否用select * from table where v3="abc"(这样就不用敲v2到v50这么多字段名),然后把选出来的v1用v1+1代替,然后完成整个insert字句?

谢谢
作者: jeanlove    时间: 2009-04-02 14:00
自己再顶一下
作者: ziggler    时间: 2009-04-02 14:28
原帖由 jeanlove 于 2009-4-2 14:00 发表
自己再顶一下

如果两个表的字段个数一样,顺序一一对应,应该可以,你试验一下不就可以了吗?
作者: jeanlove    时间: 2009-04-02 16:22
原帖由 ziggler 于 2009-4-2 14:28 发表

如果两个表的字段个数一样,顺序一一对应,应该可以,你试验一下不就可以了吗?


关键是把子查询select * from table where v3="abc"得到的结果集当中的v1改为v1+1呢?

不知道应该怎么写。谢谢!!!!
作者: ziggler    时间: 2009-04-02 17:01
标题: 回复 #8 jeanlove 的帖子
只能老老实实的写了,我觉的。
作者: ziggler    时间: 2009-04-02 18:03
原帖由 jeanlove 于 2009-4-2 16:22 发表


关键是把子查询select * from table where v3="abc"得到的结果集当中的v1改为v1+1呢?

不知道应该怎么写。谢谢!!!!

有这个V1+1好像用*就不行了。
作者: ziggler    时间: 2009-04-02 18:06
原帖由 jeanlove 于 2009-4-2 16:22 发表


关键是把子查询select * from table where v3="abc"得到的结果集当中的v1改为v1+1呢?

不知道应该怎么写。谢谢!!!!

有这个V1+1好像用*就不行了。
作者: ziggler    时间: 2009-04-02 18:08
原帖由 jeanlove 于 2009-4-2 16:22 发表


关键是把子查询select * from table where v3="abc"得到的结果集当中的v1改为v1+1呢?

不知道应该怎么写。谢谢!!!!

有这个V1+1好像就不行了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2