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

解决方案 »

  1.   

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

  2.   


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

  3.   

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

  4.   

    直接添加一个就好咯
    create sequence seq_a_id
    minvalue 1
    maxvalue 999999999999999
    start with 1
    increment by 1
    nocache;
    update a set id = seq_a_id.nextval
      

  5.   

    你这表里原来没有主键吗?太牛了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;有问题请大家提出来...
      

  6.   

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

  7.   

    虽然结贴了,我也补充一下:
    1.
    这里字段不能设定序列为默认值。官网解释:
    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一下。直接使用触发器,一次搞定。希望对楼主有帮助。