DB2 SQL-Error:插入两个相关表时的-803

时间:2014-01-31 12:18:35

标签: java db2

我有两个用这个语句创建的表:

CREATE TABLE Behandlungsvorgang (
 patientId SMALLINT NOT NULL REFERENCES Patient(id),
 datum DATE NOT NULL,
 notizen VARCHAR(100),
 PRIMARY KEY (patientId, datum)
);

CREATE TABLE behandelt (
 arztLogin VARCHAR(50) NOT NULL REFERENCES Arzt(login),
 behandlungsDatum DATE NOT NULL,
 behandlungsPatientId SMALLINT NOT NULL,
 medikamntPzn SMALLINT NOT NULL REFERENCES Medikament(pzn),
 krankheitName VARCHAR(50) NOT NULL REFERENCES Krankheit(name),
 PRIMARY KEY (arztLogin, behandlungsDatum, behandlungsPatientId, medikamntPzn, krankheitName),
 FOREIGN KEY (behandlungsDatum, behandlungsPatientId) REFERENCES Behandlungsvorgang(datum, patientId)
);

我有一个方法应该将数据插入到这个表中。它总是插入新数据,因此在插入behandelt之前我必须插入Behandlungsvorgang以满足外键要求。该方法如下所示:

public void add(TreatmentProcess tp) throws StoreException {
    try {
        PreparedStatement psBehandlungsvorgang = connection.prepareStatement("INSERT INTO Behandlungsvorgang (patientId, datum, notizen) VALUES (?, ?, ?)");
        psBehandlungsvorgang.setInt(1, tp.getPatientId());
        psBehandlungsvorgang.setDate(2, tp.getDate());
        psBehandlungsvorgang.setString(3, tp.getNotes());

        psBehandlungsvorgang.executeUpdate();

        PreparedStatement psBehandelt = connection.prepareStatement("INSERT INTO behandelt (arztLogin, behandlungsDatum, behandlungsPatientId, medikamntPzn, krankheitName) VALUES (?, ?, ?, ?, ?)");

        for (Drug drug : tp.getDrugs()) {
            psBehandelt.setString(1, tp.getDoctor());
            psBehandelt.setDate(2, tp.getDate());
            psBehandelt.setInt(3, tp.getPatientId());
            psBehandelt.setInt(4, drug.getPzn());
            psBehandelt.setString(5, tp.getDisease());
            psBehandelt.addBatch();
        }

        psBehandelt.executeBatch();
    } catch (SQLException e) {
        throw new StoreException(e);
    } 
}

我总是得到一个例外de.unidue.inf.is.stores.StoreException: com.ibm.db2.jcc.am.go: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;DBP10.BEHANDLUNGSVORGANG, DRIVER=4.7.85。如果我手动插入数据,我没有错误。例如:

insert into Behandlungsvorgang values (1, '2014-01-25', 'Test');
insert into behandelt values ('doc', '2014-01-25', 1, 1, 'Kater');
insert into behandelt values ('doc', '2014-01-25', 1, 2, 'Kater');

我在java代码中做错了什么?

2 个答案:

答案 0 :(得分:12)

-803表示您尝试插入违反表格唯一约束的行。如果您使用的是DB2 Linux / Unix / Windows,则可以从SQLERRMC获取该数字并将其应用于此查询以获取您违反的索引:

SELECT INDNAME, INDSCHEMA
FROM SYSCAT.INDEXES
WHERE IID = <index-id>
  AND TABSCHEMA = 'schema'
  AND TABNAME = 'table'

答案 1 :(得分:2)

我只是在错误的表格中搜索错误。 behandelt代替Behandlungsvorgang。我总是试图插入相同的日期。因此我违反了该表的主键约束。