Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Derby getGeneratedKey()在插入一对多关系时返回错误的值_Java_Sql_Jdbc_Derby - Fatal编程技术网

Java Derby getGeneratedKey()在插入一对多关系时返回错误的值

Java Derby getGeneratedKey()在插入一对多关系时返回错误的值,java,sql,jdbc,derby,Java,Sql,Jdbc,Derby,我有一个数据库,它在“父”和“子”之间保持一对多的关系,父可以有多个子。子表通过外键约束保存对父表的引用。以下是表格查询: CREATE TABLE Parent ( id INT GENERATED ALWAYS AS IDENTITY, name VARCHAR(55), CONSTRAINT pk_parent_id PRIMARY KEY (id) ) CREATE TABLE Child ( id INT GENERATED ALWAYS AS IDENTITY,

我有一个数据库,它在“父”和“子”之间保持一对多的关系,父可以有多个子。子表通过外键约束保存对父表的引用。以下是表格查询:

CREATE TABLE Parent (
  id INT GENERATED ALWAYS AS IDENTITY,
  name VARCHAR(55),
  CONSTRAINT pk_parent_id PRIMARY KEY (id)
)

CREATE TABLE Child (
  id INT GENERATED ALWAYS AS IDENTITY,
  name VARCHAR(55),
  parent INT CONSTRAINT fk_parent REFERENCES Parent
  CONSTRAINT pk_child_id PRIMARY KEY (id)
)
我的java代码在父列表上进行迭代,首先将父列表插入数据库,这样我就可以获得父列表的ID,用于与子列表的关联:

Statement s = this.conn.getStatement();
s.executeUpdate("INSERT INTO Parent (name) VALUES ('John')", 
    Statement.RETURN_GENERATED_KEYS);
ResultSet r = s.getGeneratedKeys();
r.next();
int parentId = r.getInt(1);
r.close();
s.close();
现在我有了父ID,我迭代该父ID的子ID(父POJO中的列表)。除了获取子对象的ID并设置其自身的值之外,代码几乎相同。查询如下所示:

s.executeUpdate("INSERT INTO Child (name, parent) VALUES ('Rocky'," + 
    parentId + ")");
运行此序列将在大部分时间内工作,但最终会出现某些行为,即从父插入查询获取生成的ID时返回的ID未引用正确的父ID。这将导致出现此异常:

java.sql.SQLIntegrityConstraintViolationException: INSERT on table 'CHILD' caused a violation of foreign key constraint 'fk_parent_id' for key (97). The statement has been rolled back.

在此之后,我检查了数据库,发现父表中甚至不存在违规的ID(本例中为97)。我不明白的是,为什么或如何在单行插入后返回不准确的ID,特别是在之前创建了成功的引用之后。

您是否可以使用始终作为标识生成的
ID INTEGER not NULL更改这两个ID声明(从1开始,递增1)
@YCF_L这对我描述的行为没有影响父行是否存在,而是使用不同的生成ID?如果是,那么生成的不同ID是什么?还是父行根本不存在?@BryanPendleton父行存在。插入语句时没有错误,并返回生成的键,根据规范,该语句应为插入的记录。但是,在本例中,返回的密钥根本不属于父记录,因为具有该id的记录不存在,但插入的记录确实存在,但具有不同的IdI。我不确定发生了什么。Derby对getGeneratedKeys的支持有点缺陷,但我还没有听说过这个特定的缺陷。
this.conn.getStatement()
在您的代码中做什么
getStatement
不是java.sql.Connection上的方法。值97令人担忧地接近100,我认为这是Derby“sequence”对象的一个神奇的“增量大小”,它位于生成的键列的下面,但是,同样,我以前没有听说过这个特定的错误。但是试着将derby.language.sequence.preallocator设置为,比如说,500,看看这是否会改变什么。