web-dev-qa-db-fra.com

ERREUR: la mise à jour ou la suppression sur la table "nom_table" viole la contrainte de clé étrangère

J'essaie de supprimer l'élève parent ou le cours parent et j'obtiens cette erreur:

Causé par: org.postgresql.util.PSQLException: ERREUR: la mise à jour ou la suppression sur la table "student" viole la contrainte de clé étrangère "fkeyvuofq5vwdylcf78jar3mxol" sur la table "registration"

La classe RegistrationId est une clé composite utilisée dans la classe Registration. J'utilise Spring data jpa et spring boot.

Qu'est-ce que je fais mal? Je sais que mettre cascadetype.all devrait également supprimer les enfants lorsque le parent est supprimé, mais cela me donne une erreur à la place.

@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;


Classe d'inscription

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

@EmbeddedId
private RegistrationId id;
8
Merv

Je l'ai fait fonctionner en utilisant l'annotation hibernate @OnDelete. Certains comment les JPA.persistence CascadeTypes ne fonctionnaient pas. Ils n'ont eu aucun effet sur celui que j'ai choisi.

Comme ci-dessous. Maintenant, je peux supprimer l'élève parent ou le cours parent et tous les enfants (inscriptions) sont supprimés avec eux.

@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

Lorsque vous utilisez une base de données relationnelle, vous définissez des entités avec des relations entre ces entités.

L'erreur que vous obtenez signifie que:

Vous essayez de supprimer un enregistrement dont la clé primaire fonctionne comme une clé étrangère dans une autre table, vous ne pouvez donc pas le supprimer.

Afin de supprimer cet enregistrement, tout d'abord, supprimez l'enregistrement avec la clé étrangère, puis supprimez l'original que vous souhaitez supprimer.

4
Moshe Arad

Les clés étrangères garantissent qu'une entrée existera dans une autre table. C'est un moyen de garantir l'intégrité des données. SQL ne vous autorisera jamais à supprimer cette entrée tant qu'elle sera toujours supprimée dans l'autre table. Soit (1) cela vous permet de savoir que vous auriez fait une grave erreur en supprimant cette chose qui est requise ou (2) vous souhaitez mettre une suppression en cascade afin que non seulement cette entrée soit supprimée, mais ce qui est supposé pour le référencer dans l'autre tableau. Des informations sur les suppressions en cascade peuvent être trouvées ici et écrites assez facilement ( https://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php ). Si aucune de ces deux descriptions ne vous convient, évaluez pourquoi votre relation de clé étrangère existe en premier lieu, car elle ne devrait probablement pas.

1
JoshKopen