oracle唯一约束错误信息

Posted

技术标签:

【中文标题】oracle唯一约束错误信息【英文标题】:Oracle unique constraint error message 【发布时间】:2011-06-10 08:42:28 【问题描述】:

我正在维护一个旧版应用程序,最近有人联系我说人们在尝试填充我们的一个 oracle 表时收到错误消息。现在,这些 oracle 表不在我们的管理范围内,但我仍然想尝试一些方法来帮助找到问题。

反正报错信息如下:

java.sql.SQLException: ORA-00001: 违反了唯一约束 (REO0.PK_TableName):

我知道我可以通过 google 在线找到很多关于此错误消息的信息。我的问题不是这个。

问题是:这里显示的表名(我用粗体表示)是 表的名称,或者是 PK_ 部分添加以表示“主键”?

我问的原因是:我不能直接访问这个数据库,但不知何故我可以看到 REO0 中的所有表,我可以找到一个带有 TableName 的表,但找不到带有 *PK_TableName* 的表表的名称。因此,如果这个 PK_ 引用诸如“主键”之类的东西(违反了它的约束),那么它会更有意义。

【问题讨论】:

【参考方案1】:

PK_tablename 是约束的名称,正如 Alex Poole 在良好评论中所述,它已在 DDL 中指定(CREATE TABLE ... (columns, CONSTRAINT PK_tablename PRIMARY KEY(columns...) ),或 ALTER TABLE ... ADD CONSTRAINT PK_tablename PRIMARY KEY(columns...)CREATE UNIQUE INDEX PK_tablename ON ... (columns)例如)。如果没有给出名称,Oracle 会生成一个以SYS 开头的名称。

请注意,通常PK_x 建议表 x 的主键,但您的约束也可能是外键约束或非空约束。

下面的查询会告诉你一切:

SELECT * FROM all_constraints WHERE constraint_name = 'PK_TABLENAME'

【讨论】:

名称由创建它的人指定(除非它是默认的SYS$ 名称),并且使用PK_<tablename> 是一种常见模式。但它只是一个手动维护的数据标准,因此您确实应该查询ALL_CONSTRAINTS 表以检查它是否指的是<tablename>。我不确定命名是否不是自动的,我已经看到了一些奇怪的地方,它们由于某种原因不合拍...... 谢谢,我使用了这个并在 all_constraints 中找到了更多有用的信息。而且表名确实是PK_之后的那个。

以上是关于oracle唯一约束错误信息的主要内容,如果未能解决你的问题,请参考以下文章

oracle唯一约束

oracle - 唯一约束 ORA-00001 与区分大小写的记录

oracle 唯一约束 为啥 唯一索引

在导入Oracle数据库的时候违反唯一约束条件是为啥?要怎么解决?

Oracle数据库主键约束与唯一索引有啥区别?

Oracle数据库主键约束与唯一索引有啥区别?