问一个很基础的oracle的问题?

各位大侠好, 问一个面试时遇到的问题. 先谢谢了

问: 一张表没有主键的表,里面已经存在很多重复数据, 要求由于业务关系,希望在不删除原有记录的情况下,给这张表添加主键.该如何做?

我认为面试官是考察你的SQL能力
[url]http://huajiang.iteye.com/blog/485059[/url]
[code="sql"]DELETE FROM hs a
WHERE ROWID <> (SELECT MIN (ROWID)
FROM hs b
WHERE a.hsflid = b.hsflid AND a.flqw_id = b.flqw_id);[/code]
但是如下面评论中的一样,这个效率是有问题的。
在数据量多的情况下,通常是使用临时表的。

说一个方法:

变更表结构,插入一个列,seqId或者Id这种字段。

属性为 number,可以为空。

变更之后,之前的数据就变成每行多了一个seqId,并且这个值为空。

然后通过程序,一行一行的读数据,然后将seqId的值进行设置,每次都+1.
从1一直到N不重复。

(这个步骤,可以通过写java代码或者存储过程都行)

所有数据设置完成后,将seqId列的属性更改为主键。

这样就好了。

添加一个 值可以为空的 列 ,不需要删掉数据吧?
直接加不行吗?我好像记得可以的诶。

数据不会是完全重复吧,否则数据就是冗余了,肯定某些列值是不同的。我认为需要结合具体业务,抽取几个列做复合主键。
要不就是楼上兄弟的意思,排重。
面试官的本意肯定不会是让你增加列作为主键,那样上层应用就的改动了。