我有两个用这些语句创建的表:
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)
);
Run Code Online (Sandbox Code Playgroud)
我有一个方法应该将数据插入到这个表中.它总是插入新数据所以在插入之前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);
}
}
Run Code Online (Sandbox Code Playgroud)
我总是得到一个例外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');
Run Code Online (Sandbox Code Playgroud)
我在java代码中做错了什么?
bha*_*mby 12
-803表示您正在尝试插入违反表的唯一约束的行.如果您使用的是DB2 Linux/Unix/Windows,则可以从SQLERRMC该查询中获取该数字并将其应用于此查询以获取您违反的索引:
SELECT INDNAME, INDSCHEMA
FROM SYSCAT.INDEXES
WHERE IID = <index-id>
AND TABSCHEMA = 'schema'
AND TABNAME = 'table'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44920 次 |
| 最近记录: |