java 两个表同时插入数据,第二个表的一个字段是取第一个表的ID值 要怎么取 我拿到的都是空。。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 两个表同时插入数据,第二个表的一个字段是取第一个表的ID值 要怎么取 我拿到的都是空。。相关的知识,希望对你有一定的参考价值。
这应该是主子表的关系,主表插入完成之后才能取到主表的id值 如果是同时插入数据,可以考虑在后台先生成主表id 然后将该id作为字段插入到子表中 也就是先把这两个表要插入的数据都准备好 主表的id也已经生成了 赋值给子表 然后两个表依次插入 参考技术A 说明插入数据还没有完成在多个连接条件下将数据从第二个表插入一个表
【中文标题】在多个连接条件下将数据从第二个表插入一个表【英文标题】:Inserting data into one table from second table on multiple join condition 【发布时间】:2020-02-26 20:45:56 【问题描述】:我正在尝试使用连接键字段将数据从第二个表 (src_tbl
) 插入到一个表 (trgt_tbl
) 中。查询似乎工作正常,但速度极慢。 trgt_tbl
中有大约 1600 万条记录,来自 src_tbl
的每日增量负载预计将有大约 50 万条记录。我正在尝试弄清楚我是否可以以更好的方式做到这一点。
注意:合并不是一个选项,因为数据是插入到 Redshift 中的,而 Redshift 不支持合并。
INSERT INTO trgt_tbl (col1,
col2,
col3,
col4,
col5,
col6)
SELECT col1,
col2,
col3,
col4,
col5,
col6
FROM src_tbl s
WHERE NOT EXISTS (
SELECT 1
FROM trgt_tbl t
WHERE
t.col1 = s.col1
OR t.col2 = s.col2
OR t.col3 = s.col3
OR t.col4 = s.col4
)
【问题讨论】:
你的实际目标是什么?您是否想做相当于UPSERT
的操作?您查看过Updating and Inserting New Data - Amazon Redshift 中的示例吗?
是的,这是一个 upsert。
但我正在尝试使用多个键来处理 upsert,这是一个挑战。
怎么样:Upsert in redshift
我尝试过这种方式,但收到错误消息:无效操作:关系“trgt_tbl”不存在;
【参考方案1】:
正如Database Developer Guide 中提到的那样,由于缺少对merge
/ upsert
的支持,您应该在临时表的帮助下使用更新和插入的组合来有效地执行合并。例如。您可以执行以下操作:
使用来自src_tbl
的数据创建一个临时表:
create temp table staging (like target);
insert into staging select s.col1, s.col2, s.col3, s.col4, s.col5, s.col6 from src_tbl s JOIN trgt_tbl t ON
t.col1 = s.col1
OR t.col2 = s.col2
OR t.col3 = s.col3
OR t.col4 = s.col4;
内连接暂存表以从trgt_tbl
中删除正在更新的行并插入暂存表中的行:
begin transaction;
delete from trgt_tbl using staging where t.col1 = s.col1 OR t.col2 = stage.col2 OR t.col3 = stage.col3 OR t.col4 = stage.col4;
insert into trgt_tbl select * from staging;
end transaction;
【讨论】:
非常感谢您的回答。但我的源表已经在 Redshift 中,并且每天都会使用增量记录更新,仅针对需要在目标表中更新、插入或删除的最后一天。因此,我认为没有必要创建另一个临时表来执行相同的连接。如果我遗漏了什么,请告诉我。以上是关于java 两个表同时插入数据,第二个表的一个字段是取第一个表的ID值 要怎么取 我拿到的都是空。。的主要内容,如果未能解决你的问题,请参考以下文章
如果一个表的列等于第二个表中的列,则在第三个表中插入值,python - mysql
在 Scala Play 框架中映射 OneToMany 不向第二个表插入数据