我刚刚尝试将Oracle数据库导入到另一个数据库,但是它给出了一个错误,告诉我在主键列中找到了重复的值。然后我检查了源表,是的确实PK中存在重复值,并且检查PK已启用且正常。现在我想知道这怎么可能发生。
编辑:我发现索引处于无法使用的状态。我不知道它是怎么发生的,只是发现了这个: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1859798300346695894
答案 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
上重新创建了该问题