主键列如何在Oracle中具有重复值?

时间:2011-09-30 14:52:14

标签: oracle primary-key

我刚刚尝试将Oracle数据库导入到另一个数据库,但是它给出了一个错误,告诉我在主键列中找到了重复的值。然后我检查了源表,是的确实PK中存在重复值,并且检查PK已启用且正常。现在我想知道这怎么可能发生。

编辑:我发现索引处于无法使用的状态。我不知道它是怎么发生的,只是发现了这个: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1859798300346695894

6 个答案:

答案 0 :(得分:7)

假设您的主键确实在此列上定义并启用,您可以检查它是否已经过验证。只有经验证的约束才能保证Oracle对所有行都是真的。

以下是具有重复值的未经验证的主键的方案:

SQL> DROP TABLE t;     
Table dropped

SQL> CREATE TABLE t (ID NUMBER);     
Table created

SQL> INSERT INTO t VALUES (1);     
1 row inserted

SQL> INSERT INTO t VALUES (1);     
1 row inserted

SQL> CREATE INDEX t_id_idx ON t(ID);     
Index created

SQL> ALTER TABLE t ADD CONSTRAINT pk_id PRIMARY KEY (ID) NOVALIDATE;     
Table altered

SQL> SELECT * FROM t;

        ID
----------
         1
         1

SQL> SELECT constraint_type, status, validated
  2    FROM user_constraints
  3   WHERE constraint_name = 'PK_ID';

CONSTRAINT_TYPE STATUS   VALIDATED
--------------- -------- -------------
P               ENABLED  NOT VALIDATED

更新

一个likely explanation是直接路径加载(来自SQL * Loader)将您的唯一索引保留在具有重复主键的不可用状态。

答案 1 :(得分:0)

您认为应用了pk的列但实际上是您的错误。该列没有定义PK ...

或者

您已应用复合/多列主键.. 尝试两次插入相同的记录,它显示错误,这意味着复合键..

答案 2 :(得分:0)

检查您是否将索引设置为唯一。

select table_name,uniqueness,index_name from all_indexes where table_name='[table_name]';


/* shows you the columns that make up the index */
select * from all_ind_columns where index_name='[index_name]';

答案 3 :(得分:0)

您已插入两次数据

OR

目的地表不为空。

OR

您在dest表上定义了一个不同的pk。

答案 4 :(得分:0)

可能已禁用约束来加载数据,然后再次运行相同的加载 - 由于表中的双重数据,索引现在可能无法验证。

最近是否有数据加载?该表是否有任何审计列,例如创建日期以确定所有rowa是否重复?

答案 5 :(得分:0)

使用延迟约束可能会导致重复值插入PK列。

检查以下链接。它描述了可能导致重复主键值的Oracle错误。我刚刚在Oracle 11g EE Rel 11.2.0.2.0

上重新创建了该问题

http://www.pythian.com/news/9881/deferrable-constraints-in-oracle-11gr2-may-lead-to-logically-corrupted-data/