0

私が取り組んでいるアプリケーションがあり、データベースにクエリを実行して結果を表示します。プログラムはデータベースにも変更を加えます(更新、削除、挿入)。最近、いくつかの変更を加えるまで、これらの機能のほとんどは正しく機能していました。現在、外部キー制約に違反していることを通知するSQLExceptionが発生しています。調べてみたところ、違反は複数のテーブル共有データの結果であることがわかりました。これを克服する方法はありますか?制約に違反せずに更新するにはどうすればよいですか?これが私の更新方法です:

InstructorEditorPanel updateEditorPanel = new InstructorEditorPanel();

updateEditorPanel.setFieldText(InstructorEditorPanel.FieldTitle.B_NUMBER, updBNumber);
updateEditorPanel.setFieldText(InstructorEditorPanel.FieldTitle.FIRST_NAME, updFName);
updateEditorPanel.setFieldText(InstructorEditorPanel.FieldTitle.LAST_NAME, updLName);


int result = JOptionPane.showConfirmDialog(null, updateEditorPanel,
              "Update Instructor",        JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
  if(result == JOptionPane.OK_OPTION)
  {
      for (InstructorEditorPanel.FieldTitle fieldTitle :    InstructorEditorPanel.FieldTitle
                 .values()) {

                    bNum =    getBNumber(updateEditorPanel.getFieldText(fieldTitle.values()[0]));
                    fName = getFirstName(updateEditorPanel.getFieldText(fieldTitle.values()[1]));
                    lName =  getLastName(updateEditorPanel.getFieldText(fieldTitle.values()[2]));
                   }
      try
{
    connection = DriverManager.getConnection(URL);
    updateInstructor = connection.prepareStatement(
    "UPDATE Instructor SET BNUMBER = ?, FIRSTNAME = ?, LASTNAME = ? WHERE BNUMBER = ?");

}catch(SQLException sqlException){
    sqlException.printStackTrace();
    System.exit(1);
}//end catch
  try
{

    updateInstructor.setString(1, bNum);
    updateInstructor.setString(2, fName);
    updateInstructor.setString(3, lName);
            updateInstructor.setString(4,mNumber);

    updateInstructor.executeUpdate();
}catch(SQLException sqlException){
        sqlException.printStackTrace();
}//end of catch
finally
{
    close();
}//end 
  }


Display(panel); }

最近、いくつかの変更を加えるまで、メソッドは問題なく機能していました。何をしたのかわかりませんが、外部キー制約違反の例外が発生しています

例外は次のとおりです。java.sql.SQLIntegrityConstraintViolationException:テーブル'INSTRUCTOR'のUPDATEにより、キー(1234500000)の外部キー制約'SQL120408141918440'に違反しました。ステートメントはロールバックされました。

データベース情報

CREATE TABLE Instructor (
BNumber varchar(10) NOT NULL,
FirstName varchar(20),
LastName varchar(30),
PRIMARY KEY (BNumber)
);

CREATE TABLE Section (
CRN int NOT NULL,
Term varchar(6) NOT NULL,
SectionNumber varchar(3),
CourseID varchar(9),
Enrollment smallint,
BNumber varchar(10),
PercentResp numeric(5,2),
CONSTRAINT CRN_Term PRIMARY KEY (CRN,Term),
FOREIGN KEY (CourseID) REFERENCES Course (CourseID), 
FOREIGN KEY (BNumber) REFERENCES Instructor (BNumber)
);

INSERT INTO Instructor (BNumber, FirstName, LastName)
VALUES 
('0000012345','Bill','Smith'),
('0000023456','Sue','Taylor'),
('0000034567','Skilar','Ramsey'),
('1234500000','Sam','Jones'),
('2345600000','Tyson','Quilez');

INSERT INTO Section (CRN, Term, SectionNumber, CourseID, Enrollment,
                 BNumber, PercentResp)
VALUES 
(40035,'201040','02B','CHM2210', 31,'0000034567',100),
(40001,'201040','02B','CGS1000', 27,'0000012345',100),
(40002,'201040','70B','CGS2100', 25,'0000012345',100),
(40003,'201040','71B','CGS2100', 19,'0000012345',100),
(40004,'201040','01B','COP1000', 15,'0000012345',100),
(40030,'201040','01B','BSCC1005',30,'0000023456',100),
(40031,'201040','02B','BSCC1005',25,'0000023456',100),
(40032,'201040','70B','BSCC1005',24,'0000023456',100),
(40000,'201040','01B','CGS1000', 15,'0000012345',100),
(40034,'201040','01B','CHM2210', 27,'0000034567',100);
4

2 に答える 2

4

交換

"UPDATE Instructor SET BNUMBER = ?, FIRSTNAME = ?, LASTNAME = ? WHERE BNUMBER = ?"

"UPDATE Instructor SET FIRSTNAME = ?, LASTNAME = ? WHERE BNUMBER = ?"

更新クエリの一致条件である場合は、主キーを更新しないでください。

于 2012-04-24T15:07:52.040 に答える