【问题标题】:Can Oracle DB table has fully duplicate records?Oracle DB 表可以有完全重复的记录吗?
【发布时间】:2013-04-22 08:37:20
【问题描述】:

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

Oracle db 中的表可以有完全重复的记录。即:

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

有这个数据:

field_A field_B
123     456 
123     456

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

【问题讨论】:

  • Oracle 分配隐式行号以在内部区分行,但通常最好为表添加唯一键或主键以实现唯一性。查看 Oracle 序列。

标签: database oracle duplicates


【解决方案1】:

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

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

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

Example of duplicates and rowids.

Discussion of issues with rowids changing over time.

【讨论】:

    【解决方案2】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多