大家好,现在表中已经有数据并且数据有重复,如图如上图,这时表中没有主键,第1,2条记录一样,第11,12一样。
现在想增加一列Integer型的主键,使表成以下图结构:           网上有很多加利用触发器或序列增加主键的方法,但这两种方法都是基于一个假设:表中没有数。,主键和一般数据一块加入时可以利用触发器或序列递增添加主键。问题是现在表中已经有数据且数据有重复的,不可能再通过触发器实现,如何实现由第一个图转化为第二个图?
           其实我遇到的是400多万条的记录的一个表,其中包含大量相同的记录,要把这400多万条的记录加一个主键,我把这个问题简化的描述一下,请求大家的帮助。

解决方案 »

  1.   


    --给你个例子
    --建表
    create table test(
    name varchar2(20));
    --测试数据
    insert into test values('name1');
    insert into test values('name2');
    insert into test values('name3');
    --加列
    alter table test add id integer;
    --创建含主键表,用于更新
    create table temprt(
    rd varchar2(18) primary key,
    id int
    );
    --将目的表的值插入到创建的表
    insert into temprt select rowid,rownum from test;
    --更新列值
    update (select A.id Aid,A.rowid Ard,B.rd,B.id Bid from test A,temprt B where A.rowid=B.rd)
    set Aid=Bid;
    --设置不空
    alter table test modify id int not null;
    --设置主键
    alter table test add constraint pk_test primary key(id); 
      

  2.   

    Tested Under Oracle 11gR2
    create table test1(name1 varchar2(40),city varchar2(40));
    insert into test1 values('name1','nanjing');
    insert into test1 values('name1','nanjing');
    insert into test1 values('name2','nanjing1');
    insert into test1 values('name3','nanjing2');
    insert into test1 values('name4','nanjing3');
    insert into test1 values('name5','nanjing4');
    insert into test1 values('name6','nanjing5');
    insert into test1 values('name7','nanjing6');
    insert into test1 values('name8','nanjing7');
    insert into test1 values('name9','nanjing8');
    insert into test1 values('name10','nanjing9');
    insert into test1 values('name10','nanjing9');
    insert into test1 values('name12','nanjing11');
    insert into test1 values('name13','nanjing12');
    insert into test1 values('name14','nanjing13');
    commit;
    alter table TEST1 add id number(10);
    create sequence SEQ_ID
      minvalue 1
      maxvalue 999999999
      start with 1;
    Update test1 set id=seq_id.nextval;
    commit;alter table TEST1
      add constraint PK_TEST1 primary key (ID);
    select ID,Name1,CITY from TEST1;
      

  3.   

    先增加一列,然后update table t set t.col=rownum ;
    alter table t add contstraint pk_t primary key (col) ;
      

  4.   

    alter table tabName add id number(8);update tabName set id = rownum
      

  5.   

    alter table tb add contstraint pk_Col primary key (col) ;