【问题标题】:autoincrement the id of table with new "child" inserts使用新的“子”插入自动增加表的 ID
【发布时间】:2017-10-18 04:50:50
【问题描述】:

我根据我们的业务需求使用 ETL 应用程序填充了我的目标表。 这个目标表有 5 个“级别”,对于每个级别,我必须插入它们相应的“子”数据。这是我选择要插入的“子”数据的脚本(请注意,还有其他列,但下面的脚本只是为了展示我如何遍历表以识别 5 个级别:

select
code_test_data + 200 as CODE_test_data_child,
test_data from targetTable
where level_test_data in (select level from dual t connect by level <=5)
order by level_test_data

目的是在我的 etl 应用程序插入主数据后执行 sql 脚本来插入子数据。

我的问题是:

如何为“子”插入管理目标表的 id 列?主插入的 id 列由我的 etl 应用程序管理。 我正在考虑几种方法:

1) 创建一个返回 max(id)+1 的函数。所以对于每一个插入,我都可以调用这个函数来添加id

2) 序列:使用Oracle 的序列功能添加最大id。但是我必须对序列的起始值进行“硬”编码。起始值将来自目标表的 max(id)。我真的不想硬编码起始值

3) 我尝试在插入 (col1,col2..) 中使用 max(id)+1 选择 max(id)+1.. 但这只是将每行的 id 增加 1。

谁有更好的解决方案可以分享一下吗?

谢谢大家

编辑:

插入主数据后,我会插入子数据,但子插入的id必须是max(id)+1: 示例:row1=1, primaryTest1, level1...row2= 2, primaryTest2, Level2...newinserts=3, childTest1 | 4, childTest1 | 5, childTest2 | 6, childTest2 ...希望这个例子能澄清我的问题。

【问题讨论】:

  • 哪个 Oracle 版本?
  • 我不确定你在问什么。我最好的解释是 - 您想将数据(1 个主插入,5 个子插入)插入到单个表中。主节点的 PK 由 ETL 应用程序预先确定。您希望将 PK 值分配给子插入而不冲突的序列值。是对的吗?如果是,我建议您使用使用两列的复合 PK - 级别(0 表示主插入,否则为 1-5),然后是一个键(使用 ETL 值作为主插入,使用序列作为子插入)。那么'key'列中是否存在冲突并不重要
  • 您好 Christian,插入主数据后,我将插入子数据,但子数据插入的 id 必须为 max(id)+1:示例:row1=1,primaryTest1,level1。 .. row2= 2, primaryTest2, Level2 ...newinserts=3, childTest1 | 4、childTest1 | 5、childTest2 | 6、childTest2 ...我希望这个例子能澄清我的问题。谢谢

标签: oracle plsql


【解决方案1】:

我找到了解决问题的方法。这个post帮助了我

这是我的解决方案(如果它可以帮助其他人):

1) 使用 targetTable 的 max(id) 中的 Start 值创建我的序列。 poste link

2) 创建一个调用此序列的过程来插入我的 id,包括我的 select 语句中的子值:

select
seq_name.nextval,
code_test_data + 200 as CODE_test_data_child,
test_data from targetTable
where level_test_data in (select level from dual t connect by level <=5)
order by level_test_data

谢谢

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2021-03-24
    • 2013-02-28
    • 2017-04-20
    • 2016-10-16
    • 2020-09-23
    相关资源
    最近更新 更多