web-dev-qa-db-ja.com

エラー:テーブル "tablename"の更新または削除は外部キー制約に違反しています

親学生または親コースを削除しようとしていますが、このエラーが表示されます:

原因:org.postgresql.util.PSQLException:エラー:テーブル "student"の更新または削除が、テーブル "registration"の外部キー制約 "fkeyvuofq5vwdylcf78jar3mxol"に違反しています

RegistrationIdクラスは、Registrationクラスで使用される複合キーです。 Spring data jpaとspring bootを使用しています。

私は何を間違えていますか? cascadetype.allを指定すると、親が削除されたときに子も削除されるはずですが、代わりにエラーが発生します。

@Embeddable
public class RegistrationId implements Serializable {

  @JsonIgnoreProperties("notifications")
  @OneToOne(cascade=CascadeType.ALL)
  @JoinColumn(name = "student_pcn", referencedColumnName="pcn")
  private Student student;

  @JsonIgnoreProperties({"teachers", "states", "reviews"})
  @OneToOne(cascade=CascadeType.ALL)
  @JoinColumn(name = "course_code", referencedColumnName="code")
  private Course course;


登録クラス

@Entity(name = "Registration")
@Table(name = "registration")
public class Registration {

@EmbeddedId
private RegistrationId id;
8
Merv

Hibernate @OnDeleteアノテーションを使用して機能させました。 JPA.persistence CascadeTypesが機能しなかった方法。どちらを選んでも効果はありませんでした。

以下のように。これで、親の生徒または親のコースを削除でき、すべての子(登録)も一緒に削除されます。

@Embeddable
public class RegistrationId implements Serializable {

    @JsonIgnoreProperties("notifications")
    @OnDelete(action = OnDeleteAction.CASCADE)
    @OneToOne
    @JoinColumn(name = "student_pcn", referencedColumnName="pcn")
    private Student student;

    @JsonIgnoreProperties({"teachers", "states", "reviews"})
    @OnDelete(action = OnDeleteAction.CASCADE)
    @OneToOne
    @JoinColumn(name = "course_code", referencedColumnName="code")
    private Course course;
9
Merv

リレーショナルDBを使用している場合、これらのエンティティ間の関係を持つエンティティを設定しています。

表示されるエラーは、次のことを意味します:

主キーが別のテーブルの外部キーとして機能しているレコードを削除しようとしていますしたがって、削除できません

そのレコードを削除するには、まず、外部キーを持つレコードを削除してから、削除したいオリジナルを削除します。

4
Moshe Arad

外部キーは、エントリが別のテーブルに存在することを保証します。これは、データの整合性を確保する方法です。 SQLでは、他のテーブルで削除されている間、このエントリを削除することはできません。 (1)これは、必要なものを削除することでGraveの間違いを犯したことを知らせているか、(2)このエントリが削除されるだけでなく、想定されているようにカスケード削除を行いたい場合他のテーブルで参照すること。カスケード削除に関する情報はここにあり、かなり簡単に記述できます( https://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php )。これらの2つの説明のどちらにも当てはまらない場合は、最初に外部キー関係が存在する理由を評価してください。

1
JoshKopen