获得从插入的数据集的主键,以链到其他插入

问题描述 投票:0回答:1

假设我有以下各表,在Oracle数据库

富:

+--------+---------+---------+
| id_foo | string1 | string2 |
+--------+---------+---------+
|      1 | foo     | bar     |
|      2 | baz     | bat     |
+--------+---------+---------+

酒吧:

+--------+-----------+--------+
| id_bar | id_foo_fk | string |
+--------+-----------+--------+
|      1 |         1 | boo    |
|      2 |         1 | bum    |
+--------+-----------+--------+

当我插入美孚,通过使用一个数据集和JDBC,如

Dataset<Row> fooDataset = //Dataset is initialized
fooDataset.write().mode(SaveMode.Append).jdbc(url, table, properties)

的ID是自动生成由数据库。现在,当我需要保存Bar,使用同样的策略,我希望能够链接它Foo,通过id_foo_fk

我看着一些可能性,如使用monotonically_increasing_id()this question建议,但不会解决这个问题,因为我需要由数据库生成的ID。我试了一下在this question建议,但它会导致同样的问题,独特的非数据库ID

它也不可能从JDBC再次选择,如string1string2可能不是唯一的。也不可能更改数据库。举例来说,我不能改变它是UUID,我不能为它添加一个触发器。这是一个传统的数据库,我们只能用

我怎样才能做到这一点?这可能与Apache的火花?

java oracle apache-spark jdbc apache-spark-sql
1个回答
0
投票

我不是一个Java专家,所以你将不得不考虑如何准确地进行数据库层,但有3种方式,你可以这样做:

  • 您可以创建一个存储过程,如果你正在使用的数据库服务器能(大部分做),并从你的代码中调用它。
  • 创建一个返回第一个插入的ID号的触发和你的下一个数据库插入使用。
  • 使用UUID并以此作为重点,而不是数据库自动生成的密钥。
热门问题
推荐问题
最新问题