首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用预准备语句使用自动生成的键批量插入到相关表中

使用预准备语句使用自动生成的键批量插入到相关表中
EN

Stack Overflow用户
提问于 2020-04-20 01:30:52
回答 2查看 156关注 0票数 0

我的应用程序中有两个相关的表(DB2数据库),分别是A和B。A有一个自动生成的主键,这个主键在表B中用作外键。我的应用程序有一个业务案例,其中数据必须批量插入到表A和B中。insert insert到B中应该将自动生成的相应insert insert的id作为其id值。

我想出的一个解决方案是查询表A中要生成的下一个id值,并在表B的准备好的语句中使用它。

但我担心的是,当表B被批量插入时,对表A的任何并发插入都会破坏这两个表之间的数据一致性。

任何对最佳方法的帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2020-04-20 02:04:42

尝尝这个。

考虑将常量作为A.A_VALB.B_VAL列的参数。为A生成的A_ID用于B.A_ID

代码语言:javascript
复制
DECLARE GLOBAL TEMPORARY TABLE A (A_ID INT GENERATED ALWAYS AS IDENTITY, A_VAL INT) ON COMMIT PRESERVE ROWS NOT LOGGED;
DECLARE GLOBAL TEMPORARY TABLE B (B_ID INT GENERATED ALWAYS AS IDENTITY, A_ID INT, B_VAL INT) ON COMMIT PRESERVE ROWS NOT LOGGED;

WITH 
  IA (A_ID, A_VAL) AS 
(
SELECT A_ID
, A_VAL -- Not needed. Just to show it in output
FROM NEW TABLE (INSERT INTO SESSION.A (A_VAL) VALUES (10))
)
, IB (B_ID, A_ID, B_VAL) AS
(
SELECT B_ID, A_ID, B_VAL -- All not needed. Just to show them in output. 
FROM NEW TABLE 
(
INSERT INTO SESSION.B (A_ID, B_VAL)
SELECT A_ID, 100 FROM IA
)
)
SELECT 
  IA.A_ID AS A_ID_A, IA.A_VAL
, IB.B_ID, IB.A_ID AS A_ID_B, IB.B_VAL  
FROM IA, IB
;

如果您不想在输出中显示插入行的值,则外部SELECT可以是any。您可以只使用SELECT 1 FROM SYSIBM.SYSDUMMY1。这里显示的技术称为select from a data-change operation

这种方法的问题是,该语句不能批量使用。

使用这种语句的另一种解决方案是首先将所有输入行插入到某个临时表中,然后在整个数据集上只使用一次类似的语句。但在这种情况下,对输入数据集有一个额外的要求。您必须能够仅使用A的列以1:1的比例将行从它连接到自身。例如,输入数据集被枚举,这样的行编号列在A中。

票数 0
EN

Stack Overflow用户

发布于 2020-04-20 16:37:45

同时批量插入到两个表中

代码语言:javascript
复制
CREATE TABLE TEST_BATCH_A (A_ID INT GENERATED ALWAYS AS IDENTITY, A_VAL INT) IN USERSPACE1;
CREATE TABLE TEST_BATCH_B (B_ID INT GENERATED ALWAYS AS IDENTITY, A_ID INT, B_VAL INT) IN USERSPACE1;

如果您想同时在两个表中使用批插入,可以对这些表尝试以下JDBC代码。

代码语言:javascript
复制
String stmt = 
  "BEGIN ATOMIC "
+ "DECLARE L_RES INT; "

+ "FOR C1 AS "

+ "WITH "
+ "  IA (A_ID) AS "
+ "("
+ "SELECT A_ID "
+ "FROM NEW TABLE (INSERT INTO TEST_BATCH_A (A_VAL) VALUES (?)) "
+ ") "
+ ", IB (B_ID) AS "
+ "("
+ "SELECT B_ID "
+ "FROM NEW TABLE "
+ "("
+ "INSERT INTO TEST_BATCH_B (A_ID, B_VAL) "
+ "SELECT A_ID, CAST(? AS INT) FROM IA "
+ ")"
+ ")"
+ "SELECT 1 C1 FROM SYSIBM.SYSDUMMY1 WHERE 1=0 "

+ "DO SET L_RES=1; END FOR;"

+ "END";

CallableStatement pst = con.prepareCall(stmt);
pst.setInt(1, 1); pst.setInt(2, 100); pst.addBatch();
pst.setInt(1, 2); pst.setInt(2, 200); pst.addBatch();
pst.setInt(1, 3); pst.setInt(2, 300); pst.addBatch();
pst.executeBatch();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61308737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档