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