2012-03-06 75 views
2

我已被分配到具有两个表的应用程序,我们称它们为MY_TABLE_ONEMY_TABLE_TWO。当用户在表格中输入数据时,数据输入MY_TABLE_ONE。这项工作完成后,一个数据库包被触发,这实质上执行以下操作:违规的非现有Oracle数据库约束

DELETE FROM MY_TABLE_TWO; 

INSERT INTO MY_TABLE_TWO 
mto.COLUMN_ONE, 
moto.COLUMN_TWO, 
mott.COLUMN_THREE 
FROM MY_TABLE_ONE mto, MY_OTHER_TABLE_ONE moto, MY_OTHER_TABLE_TWO mott 
WHERE mto.OTHER_TABLE_ONE_UUID = moto.UUID 
AND mto.OTHER_TABLE_TWO_UUID = mott.UUID; 

出于某种原因,这个包就开始因没有按规定插入用的消息:

ORA-00001: unique constraint 
(MY_SCHEMA.MY_TABLE_TWO_UK01) violated 
ORA-06512: at "MY_SCHEMA.MY_PACKAGE", line 2 
ORA-06512: at line 1 

仰望制约MY_TABLE_TWO,没有MY_TABLE_TWO_UK01约束。然而,还有一个MY_TABLE_TWO_UK约束条件,要求3个插入列是唯一的。但是,如果我运行下面的查询:

SELECT mto.COLUMN_ONE, moto.COLUMN_TWO, mott.COLUMN_THREE, COUNT(*) AS COUNTER 
FROM MY_TABLE_ONE mto, MY_OTHER_TABLE_ONE moto, MY_OTHER_TABLE_TWO mott 
WHERE mto.OTHER_TABLE_ONE_UUID = moto.UUID 
AND mto.OTHER_TABLE_TWO_UUID = mott.UUID 
GROUP BY mto.COLUMN_ONE, moto.COLUMN_TWO, mott.COLUMN_THREE 
ORDER BY COUNTER DESC; 

,那么所有的计数是1。所以它看起来并不像约束被侵犯。

有没有人知道发生了什么?我不确定01来自约束名称。而且我无法找到违反约束的地方。

+1

您 检查不会告诉你什么是明显的计数1的重复数据不被插入,由于约束 – 2012-03-06 20:55:21

+0

@SamHolder但我从拉' MY_TABLE_ONE'。我正在寻找那些在尝试将它们插入到'MY_TABLE_TWO'时抛出错误的重复项。 2或更多的计数将显示违反行的限制条件。 – 2012-03-06 20:57:24

+0

如果只有Oracle在错误信息中说“像违反唯一索引约束”这样的话。 – 2016-07-27 22:04:00

回答

13

这是一个索引

select * from all_ind_columns where index_name = 'MY_TABLE_TWO_UK01'; 
+0

该索引看起来似乎存在(我使用了Toad UI,而不是你给予的SQL返回的东西)。它似乎连接到其他3列。但是,使用这3列的分组仍然只产生1个计数。任何想法什么是违反索引? – 2012-03-06 21:09:33

+0

啊,划伤了。错过了删除我的脚本中的一列。谢谢您的帮助。计数脚本现在产生2,表明问题。我会调查。 – 2012-03-06 21:15:03

+0

+1感谢您的帮助。和很酷的名字。我<3 2001. – 2012-03-06 21:15:23