大家好,现在表中已经有数据并且数据有重复,如图
如上图,这时表中没有主键,第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
------解决方案--------------------
楼上不少的正确答案
先加一列,更新值,再加约束