Oracle DB表可以完全重复记录吗?

时间:2013-04-28 17:43:12

标签: database oracle duplicates

可能会问非常愚蠢的问题:

Oracle数据库中的表是否具有完全重复的记录。即:

DUP_TABLE:
 NUMBER(8,0) field_A
 NUMBER(8,0) field_B

有这个数据:

field_A field_B
123     456 
123     456

在这种情况下,数据库引擎如何区分这些记录?

2 个答案:

答案 0 :(得分:4)

Oracle(以及大多数关系数据库)将允许您创建可以具有重复行的表。如果要排除重复项,只需添加跨越表的所有列的UNIQUE约束。

如果您想要重复的行,当您查询表时,您将获得与表中的副本一样多的副本,除非您有DISTINCT子句或某种将重复项统一到单个实例的分组。 / p>

Oracle将每条记录存储在一个内部跟踪的单独位置。用户可以从a_table中选择rowid;获取指向该位置的指针,但是应该首先仔细考虑为什么要这样做,因为它可能是数据库设计错误的标志 - 如果这两个记录应该是可区分的,那么可能需要有另一个列区分他们的信息?或者,数据库管理的序列号可以提供比rowid更容易传达给用户的唯一号码。

Example of duplicates and rowids

Discussion of issues with rowids changing over time

答案 1 :(得分:3)

Oracle向每行隐式添加rowid命名列。 您可以查询此rowid

select rowid, field_A, field_B from DUP_TABLE;

rowid中提取您可以获得有关查询记录的物理存储的更多信息:

select DBMS_ROWID.ROWID_OBJECT(rowid) "OBJECT",
       DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) "FILE",
       DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) "BLOCK",
       DBMS_ROWID.ROWID_ROW_NUMBER(rowid) "ROW"
from DUP_TABLE;