oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决相关的知识,希望对你有一定的参考价值。

insert into SC(scno,sno,tno,time,adrss,cname) values ('1','1115115001','015','2011-2013第一学期','12#608','线性代数');

前提:数据库相关表字段完全正确;实例对象相关映射属性对应字段配置正确;
1、根本原因:未找到父项关键字的原因是因为你在保存对象的时候缺失关联对象。
2、解决思路:先保存关联对象后再保存当前对象就可以解决了。
3、解决方案:先存关联的对象,再建立关系,再保存此对象,就可以解决。
4、当进行以上操作之后依然有错误,请检查数据库对应表的外键是否关联正确,是否有除此以以外的其他关联外键,通常检查至此定会发现错误。如果有关联错误,修改关联。如果其他外键,需要其他的关联对象,也可以暂时去除其他外键。
5、通常至此步,问题一定解决。如有不懂,请再追问。
参考技术A 这个错误应该是你的每一个字段是外键约束,例如:学院号、学号之类

但是在你的主表中没有这个号码。
参考技术B 可以通过sql/plus客户端工具查看查看这张表的属性(建表语句),看看该表的什么主键是reference哪一张主表A,该主表A中需要先有对应的key value记录 参考技术C time是时间格式,2011-2013肯定不能满足。

Hibernate ORA-02292: 违反完整性约束 (ROOT.SYS_C007062) - 找到子记录

【中文标题】Hibernate ORA-02292: 违反完整性约束 (ROOT.SYS_C007062) - 找到子记录【英文标题】:Hibernate ORA-02292: integrity constraint (ROOT.SYS_C007062) violated - child record found 【发布时间】:2015-11-26 16:09:20 【问题描述】:

我关注的是休眠实体:

@Entity
@Table(name = "News")
public final class News implements Serializable, IEntity 

private static final long serialVersionUID = 3773281197317274020L;

@Id
@SequenceGenerator(name = "NEWS_SEQ_GEN", sequenceName = "NEWS_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "NEWS_SEQ_GEN")
@Column(name = "NEWS_ID", precision = 0)
private Long newsId; // Primary key

@Column(name = "TITLE")
private String title;

@Column(name = "SHORT_TEXT")
private String shortText;

@Column(name = "FULL_TEXT")
private String fullText;

@Temporal(TemporalType.DATE)
@Column(name = "CREATION_DATE")
private Date creationDate;

@Temporal(TemporalType.DATE)
@Column(name = "MODIFICATION_DATE")
private Date modificationDate;

@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)
@JoinColumn(name = "NEWS_ID", updatable = false, referencedColumnName = "NEWS_ID")
@OrderBy("creationDate ASC")
private List<Comment> commentsList;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "NEWS_TAG", joinColumns =  @JoinColumn(name = "NEWS_ID") , inverseJoinColumns =  @JoinColumn(name = "TAG_ID") )
private Set<Tag> tagSet;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "NEWS_AUTHOR", joinColumns =  @JoinColumn(name = "NEWS_ID") , inverseJoinColumns =  @JoinColumn(name = "AUTHOR_ID") )
private Set<Author> author;

第二个:

@SequenceGenerator(name = "COMMENTS_SEQ", sequenceName = "COMMENTS_SEQ")
@Entity
@Table(name = "Comments")
public class Comment implements Serializable, IEntity 

private static final long serialVersionUID = 3431305873409011465L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "COMMENTS_SEQ")
@Column(name = "COMMENT_ID", precision = 0)
private Long commentId; // Primary key

@Column(name = "NEWS_ID")
private Long newsId;

@NotEmpty
@NotNull
@Column(name = "COMMENT_TEXT")
private String commentText;

@Temporal(TemporalType.DATE)
@Column(name = "CREATION_DATE")
private Date creationDate;

当我尝试删除实体新闻时,我收到异常 ORA-02292:违反完整性约束 (ROOT.SYS_C007062) - 找到子记录。因此,如果我删除属性“updatable = false”,它会尝试将可为空的字段设置为属性 Comment。我的错误是什么?请帮忙。 谢谢。

【问题讨论】:

【参考方案1】:

因为您的新闻记录与 cmets 具有一对一或一对多的关系。您很可能在定义表时没有指定 CACASDE ON DELETE 子句。为了删除实体 NEWS,您必须确保其所有相关的 cmets 记录都已删除或正在引用另一个 NEWS 记录。 基本上是 ORA 02292 异常的定义。

【讨论】:

应该在哪里指定级联删除?我在 onetomany 注释中设置了这个属性!并且其他 2 个关系也正常工作(tagSet 和作者) 通常你会在你的 DDL(数据定义语言)中添加一个级联子句 看看级联删除是你可以做的事情,但你必须考虑一下,在你的系统环境中这是可以接受的吗?让我举个例子:在计费系统中,表 CUSTOMER 可以有一条记录,而表 BILL 可以有多个记录。您认为删除客户时删除所有账单是否明智?我个人认为不是,例如,账单可能尚未支付。这是您在实际包含在 DDL 中之前需要考虑的事情。很简单,你要删除的记录有你需要删除的子记录。

以上是关于oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

oracle - 违反完整性约束 - 找到子记录

ORA-02292: 违反完整约束条件 处理

ORA-02292: 违反完整性约束 - 在 ORACLE SQL Developer 中创建过程时发现子记录?

Oracle的ORA-02292报错:违反完整性约束,已找到子记录

Oracle的ORA-02292报错:违反完整性约束,已找到子记录

ora-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录