当前位置: 代码迷 >> Oracle开发 >> 怎么向Oracle已经有数据的表中增加主键
  详细解决方案

怎么向Oracle已经有数据的表中增加主键

热度:50   发布时间:2016-04-24 07:27:33.0
如何向Oracle已经有数据的表中增加主键?
大家好,现在表中已经有数据并且数据有重复,如图

如上图,这时表中没有主键,第1,2条记录一样,第11,12一样。
现在想增加一列Integer型的主键,使表成以下图结构:

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



------解决方案--------------------
SQL code
--给你个例子--建表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);
------解决方案--------------------
Tested Under Oracle 11gR2
SQL code
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;
------解决方案--------------------
先增加一列,然后update table t set t.col=rownum ;
alter table t add contstraint pk_t primary key (col) ;
------解决方案--------------------
SQL code
alter table tabName add id number(8);update tabName set id = rownum
------解决方案--------------------
楼上不少的正确答案
先加一列,更新值,再加约束
  相关解决方案