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 - 唯一约束 ORA-00001 与区分大小写的记录