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

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

反正报错信息如下:

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

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

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

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

【问题讨论】:

    标签: oracle constraints


    【解决方案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_之后的那个。
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多