SQLException: ORA-02292: constrângerea de integritate (SCHOOL.STUDENT_STAGE_FK) a fost încălcată – s-a găsit o înregistrare copil (Programare, Java, Sql, Oracle, Jdbc)

mohamedn a intrebat.

Aici am o problemă în codul meu atunci când vreau să șterg o înregistrare:(student) din baza de date și știu că există o cheie conexă
dar nu pot să rezolv această problemă am încercat să șterg studentul care se află pe stage și acesta este codul:

public int deleteStudentStage(int stdId) //delete student by stId
{
    DatabaseConnection dbconn = new DatabaseConnection();
    Connection conn = dbconn.getConn();
    PreparedStatement pStm = null;
    int rows = 0;
    try
    {
        //String sql = "DELETE FROM STUDENT_STAGE WHERE STUDENT_ID = ? AND STAGE_ID = ?";

        String sql = "DELETE FROM STUDENT WHERE ID = ? ";

        pStm = conn.prepareStatement(sql);

        //fill SQL parameters from student: //
        pStm.setInt(1, stdId);

        // excute //
        rows = pStm.executeUpdate();
    }
    catch (SQLException ex) 
    {
        System.out.println("SQLException: " + ex.getMessage());
    }
     finally
    {
        try {
            conn.commit();
            pStm.close();
            conn.close();
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());;
        }
    }
    return rows;
}  

Aici este schema.

3 răspunsuri
Marco

puteți da mai multe informații despre asta, în mod normal, asta se întâmplă atunci când aveți o cheie foregin, în acest caz a tabelului STUDENT, trebuie să ștergeți toate rândurile din celălalt tabel mai întâi înainte de a șterge STUDENT, puteți, de asemenea, să o rezolvați, adăugând o ștergere în cascadă, atunci când creați cheia foregin

trebuie să faceți următoarele:

DELETE FROM STUDENT_STAGE WHERE STUDENT_ID=? 
DELETE FROM STUDENT WHERE ID = ? 

de asemenea, puteți actualiza cheia principală din tabel pentru ștergerea în cascadă:

ALTER TABLE STUDENT_STAGE DROP FOREIGN KEY STUDENT_STAGE_FK; 
ALTER TABLE STUDENT_STAGE ADD CONSTRAINT STUDENT_STAGE_FK FOREIGN KEY STUDENT_ID REFERENCES STUDENT (ID) ON DELETE CASCADE ON UPDATE CASCADE;

Odată cu actualizarea cheii de origine, ștergerea unui student, ștergeți și toate informațiile referitoare la acest student din tabelul STUDENT_STAGE.

Comentarii

  • Da, știu că se întâmplă acest lucru, dar vreau să șterg un anumit student într-o anumită etapă în loc de ștergerea în cascadă, mă înțelegeți? –  > Por mohamedn.
  • cred că da, te-am înțeles @mohamedn , dar trebuie să ștergeți informațiile din tabelul stage, pentru acest student, înainte de a șterge studentul, sau puteți actualiza cheia de origine numită SCHOOL.STUDENT_STAGE_FKpentru ștergerea în cascadă –  > Por Marco.
  • aceasta este ideea, cum pot șterge informațiile din tabelul stage pentru un anumit student, însă, în acest stage există mai mulți studenți, deci cum pot rezolva această problemă. puteți să scrieți o comandă sql de cod pentru acest lucru, ca un exemplu?  > Por mohamedn.
  • Da, pot să o scriu, dar puteți să ne comunicați schema acestor tabele? –  > Por Marco.
  • desigur , sunt adăugat un link mai sus care conține imaginea schemei @MarcoPens –  > Por mohamedn.
Alermikon

În primul rând trebuie să ștergeți elementele din tabelul copil, aveți chiar și interogarea aproape corectă pentru acest lucru.

DELETE FROM STUDENT_STAGE WHERE STUDENT_ID=?

Și după aceasta ștergeți elevul cu interogarea curentă.

Arsalan Ali Shah

Trebuie să treceți Valoarea în clauza where care id de student pe care trebuie să îl ștergeți.

String sql = "DELETE FROM STUDENT WHERE ID = '"+stdId+"' ";