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

时间:2022-09-09 12:23:46
各位大牛,小弟在开发过程中,遇到了这样一个问题,由于新功能的增加需要使原有的一张表的结构作出调整,需要添加一个id主键字段,但是因为表里有很多数据了,所以,怎样才能添加这个字段,并且使原有的数据也能够获得id呢?表名为:PROJECT_COLUMN ,请各位大牛帮帮忙,在线等!

10 个解决方案

#1


两个方法:
1,重新创建一个表,然后创建一个序列,把老数据导入新表,删除老表,修改新表名字为老表
2,直接在原来表上增加一个字段,创建一个序列,通过更新的方式修改老数据的这个字段

#2


能具体说一下两种方法吗,我是数据库菜鸟,最好能写出一个sql语句就更好了,我在网上查资料说用序列和触发器,不知道具体是怎样操作的?

#3


引用 1 楼 wanglipo 的回复:
两个方法:
1,重新创建一个表,然后创建一个序列,把老数据导入新表,删除老表,修改新表名字为老表
2,直接在原来表上增加一个字段,创建一个序列,通过更新的方式修改老数据的这个字段


我使用的是方法2,
原因是 oracle 数据库不存在自增长字段

#4


rowid 不就是自增长的么。。而且唯一。。

#5


直接添加一个就好咯


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


update a set id = seq_a_id.nextval

#6


引用 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

#7


引用 楼主 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;

有问题请大家提出来...

#8


感谢这么多人的热心帮忙,问题已成功解决,原本表是用来做参数的,只需要查询一下就可以了,所以就没有弄id主键了,但是后来客户的需求变更添加了一个比较变态的功能,然后发现数据需要操作了,新建一张表的话那么多数据不好弄,时间又比较紧,所以就……我使用的方法就是5楼所讲的sql,在此谢谢HJ_daxian大牛的帮忙!

#9


结贴给分 要生双胞胎了  怎么在已有数据的表中添加id字段并且自增,在线等

#10


虽然结贴了,我也补充一下:
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

希望对楼主有帮助。

#1


两个方法:
1,重新创建一个表,然后创建一个序列,把老数据导入新表,删除老表,修改新表名字为老表
2,直接在原来表上增加一个字段,创建一个序列,通过更新的方式修改老数据的这个字段

#2


能具体说一下两种方法吗,我是数据库菜鸟,最好能写出一个sql语句就更好了,我在网上查资料说用序列和触发器,不知道具体是怎样操作的?

#3


引用 1 楼 wanglipo 的回复:
两个方法:
1,重新创建一个表,然后创建一个序列,把老数据导入新表,删除老表,修改新表名字为老表
2,直接在原来表上增加一个字段,创建一个序列,通过更新的方式修改老数据的这个字段


我使用的是方法2,
原因是 oracle 数据库不存在自增长字段

#4


rowid 不就是自增长的么。。而且唯一。。

#5


直接添加一个就好咯


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


update a set id = seq_a_id.nextval

#6


引用 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

#7


引用 楼主 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;

有问题请大家提出来...

#8


感谢这么多人的热心帮忙,问题已成功解决,原本表是用来做参数的,只需要查询一下就可以了,所以就没有弄id主键了,但是后来客户的需求变更添加了一个比较变态的功能,然后发现数据需要操作了,新建一张表的话那么多数据不好弄,时间又比较紧,所以就……我使用的方法就是5楼所讲的sql,在此谢谢HJ_daxian大牛的帮忙!

#9


结贴给分 要生双胞胎了  怎么在已有数据的表中添加id字段并且自增,在线等

#10


虽然结贴了,我也补充一下:
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

希望对楼主有帮助。