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

在Oracle中,主键列如何具有重复的值?,oracle,primary-key,Oracle,Primary Key,我刚刚尝试将一个Oracle数据库导入另一个数据库,它给出了一个错误,表明在主键列中发现了重复的值。然后我检查了源表,是的,PK中确实有重复的值,并且检查了PK是否启用和正常。现在我想知道这是怎么发生的 编辑:我发现索引处于不可用状态。我不知道是怎么发生的,只是发现了这个: 你认为pk适用的专栏,但实际上是你的错误。PK未在该列上定义 或 您已应用复合/多列主键。。 尝试插入同一条记录两次,它显示错误,这意味着复合键。检查索引设置是否唯一 select table_name,uniqueness

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

编辑:我发现索引处于不可用状态。我不知道是怎么发生的,只是发现了这个:

你认为pk适用的专栏,但实际上是你的错误。PK未在该列上定义

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

检查索引设置是否唯一

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]';

您已经插入了两次数据

目标表不是空的


您在dest表上定义了不同的主键。

假设您的主键确实在该列上定义并启用,您可以检查它是否已验证。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

更新:
一个是直接路径加载(来自SQL*Loader)使您的唯一索引处于不可用状态,主键重复。

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


最近是否有数据加载?该表是否有任何审核列(如create date)来确定所有行是否重复?

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

检查下面的链接。它描述了可能导致主键值重复的Oracle错误。我刚刚在Oracle 11g EE Rel 11.2.0.2.0上重新创建了这个问题


刚才我重新检查了一下,它只有一列主键。有一个唯一的索引和一个PK约束。我检查过了,它是唯一的,只有一列。但我发现它处于无法使用的状态。但是为什么它不能用呢!表中的每一条记录都有两条记录。你能发布表的描述吗?