oracle中有张表table1,主键是column1,非自增的,这张表中已经有数据了。
现在我想加一个自增的字段表示主键,将原来的column1字段仍然保持只是不做主键了,这个该怎么做?请各位帮帮我!
我考虑了一种方案是,另外建一张表table2,字段跟table1一样,只不过多个自增字段,然后将table1中的数据插入到table2中,再删掉table1,再将table2改下名字变成table1。这样应该可以,就是觉得比较麻烦。
各位有没有直接在table1做修改的办法?
直接在table1上改,增加一列,修改主键,但是这个主键序列的值怎么生成?
谢谢各位!小弟不胜感激!应该很简单的问题吧,让各位见笑了,因为任务比较急,在线等各位的回复,谢谢!

解决方案 »

  1.   

    直接在table1上改,增加一列,修改主键,但是这个主键序列的值怎么生成?
    可以对表进行DDL操作?会影响原有的应用?
    如果不会建议这么做,主键自增的参考我的BLOG(2种方法)
    http://blog.csdn.net/java3344520/archive/2009/11/30/4907591.aspx
      

  2.   

    Alter table tabname add column col type  ;
    commit;
    Alter table tabname drop primary key(old_col)  ;
    commit;
    Alter table tabname add primary key(col)  ;
    commit;
      

  3.   

    主键在insert时由trigger调用sequence生成。(:new.key_col = seq_1.nextval)
      

  4.   

    序列和触发器我都已经建好了,但是这个字段下的值怎么生成?因为这个表中已经有数据了,我不可能再做insert操作,我可以先生成这些自增的值在修改主键。
      

  5.   

    -- 先增加一个字段,用以表示自增字段,
    -- 然后用row_number() over(order by old_key_column) 去更新新建的字段。-- 然后根据 row_number()生成的ID号,查出最大的ID号,去新创建一个序列,
    -- 此序列为 查出最大的ID号+1 作为起始点(start with ..)-- 然后创建触发器,每次插入数据时 自动取此序列的下一个值,给新加的自增字段!
      

  6.   


    -- Oracle 自增字段 示例:CREATE TABLE test(
    id number(18,0),
    name varchar2(20));CREATE sequence test_seq start with 1 increment by 1 nomaxvalue nocycle;CREATE OR REPLACE TRIGGER test_trig_autoinc
    BEFORE INSERT ON test
    FOR EACH ROW
    BEGIN
      IF (:new.ID IS NULL) THEN 
        SELECT test_seq.nextval INTO :new.ID FROM DUAL;
      END IF;
    END;
    /insert into test(name) values('luoyoumou1');
    insert into test(name) values('luoyoumou2');commit;SQL> select * from test;        ID NAME
    ---------- ---------------------------------------
             1 luoyoumou1
             2 luoyoumou2已用时间:  00: 00: 00.32-- 看到了吧:id 字段的值自动插入了,不用你管!
      

  7.   

    那你用序列UPDATE进去,用ROWNUM, 
      

  8.   

    select seq.nextval from dual connect by rownum<=(select max(column1) from table1);
    然后就可以了
      

  9.   

    SQL> SELECT * FROM test;
     
      A    B
    --- ----
     14    0
     12    4
      8    2
      2    2
     44    9
     23    8
     
    6 rows selected
     
    SQL> update test set a=seq_code_name.nextval;
     
    6 rows updated
     
    SQL> select * from test;
     
      A    B
    --- ----
     41    0
     42    4
     43    2
     44    2
     45    9
     46    8
     
    6 rows selected
     
    SQL> 
      

  10.   

    添加一列,然后用rownum做主键,然后建立一个序列,把序列初始值调整一下,就可以自动生成了。