web-dev-qa-db-ja.com

DB2 SQL-エラー:2つの関連するテーブルに挿入すると-803

このステートメントで作成された2つのテーブルがあります。

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コードで何が間違っているのですか?

5
stevecross

間違ったテーブルでエラーを検索しました。 behandeltの代わりにBehandlungsvorgang。私はいつも同じ日付を挿入しようとしました。したがって、私はこのテーブルの主キー制約に違反しました。

2
stevecross

-803 は、テーブルの一意の制約に違反する行を挿入しようとしていることを意味します。 DB2 Linux/Unix/Windowsを使用している場合は、その番号をSQLERRMCから取得し、それをこのクエリに適用して、違反しているインデックスを取得できます。

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