【问题标题】:Nonexisting Oracle Database Constraint Violated违反了不存在的 Oracle 数据库约束
【发布时间】:2012-03-06 20:50:37
【问题描述】:

我被指派处理一个有两个表的应用程序,我们称它们为MY_TABLE_ONEMY_TABLE_TWO。当用户在表单中输入数据时,数据会输入到MY_TABLE_ONE。完成后,会触发一个数据库包,它本质上做了以下工作:

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
  • @SamHolder 但我是从MY_TABLE_ONE 拉出来的。我正在寻找在您尝试将它们插入MY_TABLE_TWO 时引发错误的重复项。 2 或更多的计数将显示违反行的约束。
  • 如果 Oracle 愿意在错误消息中说“违反唯一索引约束”之类的话。

标签: sql oracle unique-constraint


【解决方案1】:

这是一个索引

select * from all_ind_columns where index_name = 'MY_TABLE_TWO_UK01';

【讨论】:

  • 该索引似乎确实存在(我使用了 Toad UI,而不是您提供的没有返回任何内容的 SQL)。它似乎连接到其他 3 列。但是,使用这 3 列的分组仍然只产生 1 个计数。知道索引违反了什么吗?
  • 啊,从头开始。错过了在我的脚本中删除一列。谢谢您的帮助。计数脚本现在产生 2,表示问题。我会调查的。
  • 花了将近2天,调试这个问题。非常感谢。我正在执行批量插入,但无法弄清楚数据有什么问题。不知道它会是一个索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多