【问题标题】:Unique Constraint Violated on empty table空表违反唯一约束
【发布时间】:2017-03-06 19:06:40
【问题描述】:

我最近收到一个案例,我的客户遇到了 ORA-00001:违反唯一约束错误。当程序试图截断两个表然后将数据插入其中时,就会发生这种情况。 从错误日志文件中,截断步骤已完成, 从 INTERNET_GROUP 中删除 从 INTERNET_ITEM 中删除

但在此之后,插入 Internet_group 表触发了 ORA-00001 错误。我想知道是否有与此错误相关的任何数据库设置?我从未使用过 Oracle,我想知道 Oracle 是否使用 SELECT 语句对一行进行了锁定,在这种情况下,该行被锁定并且不会以某种方式被删除?任何帮助表示赞赏。

【问题讨论】:

  • 截断!=删除,但可能不相关。您确定它不只是尝试插入多个冲突行吗?当然,与现有数据相比,您要插入的数据本身必须是唯一的,而不仅仅是。而且您确定删除没有回滚 - 发生这种情况后您检查过表中的数据吗? (可能你有一个损坏的索引或其他东西,但首先排除明显的)
  • 你能举一个可重现的例子吗?或者至少涉及到 DDL/DML?
  • 删除提交了吗?
  • 听起来像是一个批量插入的东西——在同一个批量中,您使用相同的键插入多行。你如何插入表格?你使用“插入选择”吗?

标签: oracle ora-00001


【解决方案1】:

请注意,截断和删除是有区别的。你说你截断了表格,但你提到了“删除”。那是完全不同的。 如果您确定要清空表格,请尝试替换为

truncate table internet_group reuse storage;

请注意,truncate 语句不需要提交,因为它被视为 DDL(数据定义语言)语句,而不是像更新和删除这样的 DML(数据修改语言)语句。

此外,选择没有行锁定。但是更改仅在提交时对数据库中的其他会话应用和可见。 我猜这是发生了什么事;您删除了记录但没有执行提交(还)并随后插入了新记录。

编辑: 我现在意识到您可能正在插入多条记录.... 另一种选择可能是,数据本身会导致违规。你能提供桌子上的约束吗?必须有主键或唯一约束。您可能希望将其保留在您的数据集上。

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多