我想知道是否有人可以在从相当简单的表中删除条目时解释H2 JDBC驱动程序的行为。
使用下表定义时,如果删除了一个条目(预期行为),executeUpdate()
实例的方法PreparedStatement
将返回1
。
CREATE TABLE IF NOT EXISTS "MATERIAL" (
"CODE" VARCHAR(5) NOT NULL,
"NAME" VARCHAR(100) NOT NULL
);
在PRIMARY KEY
列上添加CODE
约束时,相同的方法会返回0
,尽管该条目已成功删除(不期望行为)。
CREATE TABLE IF NOT EXISTS "MATERIAL" (
"CODE" VARCHAR(5) NOT NULL,
"NAME" VARCHAR(100) NOT NULL,
PRIMARY KEY ("CODE")
);
最有趣的是,当添加INT
类型的列作为PRIMARY KEY
时,返回值再次为1
:
CREATE TABLE IF NOT EXISTS "MATERIAL" (
"ID" INT NOT NULL AUTO_INCREMENT,
"CODE" VARCHAR(5) NOT NULL,
"NAME" VARCHAR(100) NOT NULL,
PRIMARY KEY ("ID")
);
是否有人能够重建这种行为并可能以某种方式向我解释?
我已经使用maven包含了当前版本的H2 DB。
编辑:
如果我最终为UNIQUE
列添加CODE
约束,则返回值再次为0
...
CREATE TABLE IF NOT EXISTS "MATERIAL" (
"ID" INT NOT NULL AUTO_INCREMENT,
"CODE" VARCHAR(5) NOT NULL UNIQUE,
"NAME" VARCHAR(100) NOT NULL,
PRIMARY KEY ("CODE")
);
编辑2:
用于删除条目的查询如下所示(在PreparedStatement
中使用):
DELETE FROM MATERIAL WHERE CODE = ?
解决方案:
我很抱歉让你烦恼。实际上,表定义或JDBC驱动程序没有问题。这是我的测试数据 - 从早期的测试中我想要INSERT两个具有相同CODE
的条目。这是一个多行插入 - 显然这是失败的,当CODE
是PK或具有UNIQUE索引时。因此,在这种情况下,executeUpdate()
只能返回0
,因为表格中根本没有数据。