怎么在已有数据的表中添加id字段并且自增,在线等

abc890915 2012-12-04 01:30:45
各位大牛,小弟在开发过程中,遇到了这样一个问题,由于新功能的增加需要使原有的一张表的结构作出调整,需要添加一个id主键字段,但是因为表里有很多数据了,所以,怎样才能添加这个字段,并且使原有的数据也能够获得id呢?表名为:PROJECT_COLUMN ,请各位大牛帮帮忙,在线等!
...全文
4527 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ora-0600 2012-12-07
  • 打赏
  • 举报
回复 1
虽然结贴了,我也补充一下: 1.
引用 7 楼 mengwl1009 的回复:
--创建新表 create table PROJECT_COLUMN_COPY( id int primary key default ID_seq.nextval, COLUMN01 varchar2(20), COLUMN02 varchar2(20), COLUMN03 number(9,3), ... )
这里字段不能设定序列为默认值。官网解释: Restriction on Default Column Values , A DEFAULT expression cannot contain references to PL/SQL functions or to other columns, the pseudocolumns CURRVAL, NEXTVAL, LEVEL, PRIOR, and ROWNUM, or date constants that are not fully specified. 创建完之后,可以通过触发器在字段上使用序列。 2. 5楼的方法有个缺陷: 如果再往里插入数据的话,id还是没有值的,还要update一下。直接使用触发器,一次搞定。
引用 5 楼 HJ_daxian 的回复:
直接添加一个就好咯 SQL code?123456789create sequence seq_a_idminvalue 1maxvalue 999999999999999start with 1increment by 1nocache; update a set id = seq_a_id.nextval
希望对楼主有帮助。
  • 打赏
  • 举报
回复
结贴给分 要生双胞胎了
abc890915 2012-12-04
  • 打赏
  • 举报
回复
感谢这么多人的热心帮忙,问题已成功解决,原本表是用来做参数的,只需要查询一下就可以了,所以就没有弄id主键了,但是后来客户的需求变更添加了一个比较变态的功能,然后发现数据需要操作了,新建一张表的话那么多数据不好弄,时间又比较紧,所以就……我使用的方法就是5楼所讲的sql,在此谢谢HJ_daxian大牛的帮忙!
ora-0600 2012-12-04
  • 打赏
  • 举报
回复
引用 楼主 abc890915 的回复:
各位大牛,小弟在开发过程中,遇到了这样一个问题,由于新功能的增加需要使原有的一张表的结构作出调整,需要添加一个id主键字段,但是因为表里有很多数据了,所以,怎样才能添加这个字段,并且使原有的数据也能够获得id呢?表名为:PROJECT_COLUMN ,请各位大牛帮帮忙,在线等!
你这表里原来没有主键吗?太牛了。。。 1楼方法2 +1 --创建序列器 CREATE SEQUENCE ID_seq START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE ORDER NOCACHE NOCYCLE; --创建新表 create table PROJECT_COLUMN_COPY( id int primary key default ID_seq.nextval, COLUMN01 varchar2(20), COLUMN02 varchar2(20), COLUMN03 number(9,3), ... ) --转移数据 insert into PROJECT_COLUMN_COPY (COLUMN01 ,COLUMN02 ,COLUMN03 ,... ) select * from PROJECT_COLUMN; --删除旧表 drop table PROJECT_COLUMN; --修改表名 alter table PROJECT_COLUMN_COPY rename to PROJECT_COLUMN; 有问题请大家提出来...
Galen_Gao 2012-12-04
  • 打赏
  • 举报
回复
引用 5 楼 HJ_daxian 的回复:
直接添加一个就好咯 SQL code?123456789create sequence seq_a_idminvalue 1maxvalue 999999999999999start with 1increment by 1nocache; update a set id = seq_a_id.nextval
ding 顶
  • 打赏
  • 举报
回复
直接添加一个就好咯

create sequence seq_a_id
minvalue 1
maxvalue 999999999999999
start with 1
increment by 1
nocache;


update a set id = seq_a_id.nextval
izj 2012-12-04
  • 打赏
  • 举报
回复
rowid 不就是自增长的么。。而且唯一。。
hupeng213 2012-12-04
  • 打赏
  • 举报
回复
引用 1 楼 wanglipo 的回复:
两个方法: 1,重新创建一个表,然后创建一个序列,把老数据导入新表,删除老表,修改新表名字为老表 2,直接在原来表上增加一个字段,创建一个序列,通过更新的方式修改老数据的这个字段
我使用的是方法2, 原因是 oracle 数据库不存在自增长字段
abc890915 2012-12-04
  • 打赏
  • 举报
回复
能具体说一下两种方法吗,我是数据库菜鸟,最好能写出一个sql语句就更好了,我在网上查资料说用序列和触发器,不知道具体是怎样操作的?
wanglipo 2012-12-04
  • 打赏
  • 举报
回复
两个方法: 1,重新创建一个表,然后创建一个序列,把老数据导入新表,删除老表,修改新表名字为老表 2,直接在原来表上增加一个字段,创建一个序列,通过更新的方式修改老数据的这个字段

17,141

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧