如何链接DB2表

时间:2019-01-08 14:08:00

标签: ibm-midrange db2-400

我有标题和详细信息表,并且那些1:N之间的关系 这两个表都有自动SEQ号字段,我想使用某种技术将这两个表链接起来,以便我可以追溯。 我有两种解决方案,如果您从其中一个或另一个更好的选择中获得建议,则需要您的帮助。

(1)使用数据区并存储一个10000000开头,并为每个标题插入和多个详细信息插入获取它...增加数量并更新数据区。(在这种情况下,两个表都将具有自己的自动SEQ数字和链接的密钥) (2)在插入记录的同时获取标头表SEQ号,并将其用作明细表中的关键字。 (在这种情况下,标头将具有自动seq键,而明细表将具有自动SEQ键和链接键作为标头表的自动键)

请告知。

谢谢

1 个答案:

答案 0 :(得分:2)

这听起来像是序列的工作。序列是一个SQL对象,每次请求时都会返回下一个序列号。它是在数据区中实现的,但这对您没有影响。重要的是,可以使用SQL创建和访问序列。

要以最简单的形式创建序列,请发出以下SQL语句:

CREATE SEQUENCE NEXT_ORDER_NO;

有关创建序列的其他信息,可以在Knowledge Center中找到。

要从该序列中生成数字,可以在如下的SQL语句中包含NEXT VALUE FOR <sequence name>

INSERT INTO ORDER_MASTER (ORDER_NO, CUSTOMER_NO)
  VALUES (NEXT VALUE FOR NEXT_ORDER_NO, 15);

这会将新记录插入到表ORDER_MASTER中,该记录具有序列中的下一个订单号,值15是客户编号。

要获取从序列中生成的最新值,请使用PREVIOUS VALUE FOR <sequence name>,如下所示:

INSERT INTO ORDER_DETAIL (ORDER_NO, ORDER_LINE, ITEM_NO)
  VALUES (PREVIOUS VALUE FOR NEXT_ORDER_NO, 1, 'AX14450')

这会将一条记录插入表ORDER_DETAIL中,该记录的最新生成的ORDER_NO,订单行为1,项目编号为“ AX14450”。您可以根据需要多次使用PREVIOUS VALUE FOR <sequence name>,它将始终返回相同的值。您还可以在Knowledge Center中找到更多信息。

有一些警告。 NEXT VALUEPREVIOUS VALUE的行为与您期望的一样,即使多个作业使用相同的顺序。作业1将无权访问作业2的生成值,反之亦然。但这意味着根据序列的定义方式,序列号中可能会留有空白,或者序列中可能会出现空白。请务必阅读我提供的两个参考资料,以进行更深入的解释。


编辑:

如果您不想直接在插入内容中使用NEXT VALUE,也可以像这样使用VALUES INTO

VALUES NEXT VALUE FOR NEXT_ORDER_NO INTO :<local variable>

您可以在Knowledge Center中找到有关此语句的更多信息。


编辑(2)

作为序列的替代方法,您可以使用一个身份列(根据您的注释,这似乎是您想要的),但是您不必在SQL中做任何疯狂的事情即可检索分配的最后一个身份值。像这样使用IDENTITY_VAL_LOCAL

INSERT INTO HTABLE (NAME, AGE) VALUES ('Mark', 51);

INSERT INTO DTABLE (hseq,Address,Zip) 
  VALUES (IDENTITY_VAL_LOCAL(),'1701 creek ave', 19670);

INSERT INTO DTABLE (hseq,Address,Zip) 
  VALUES (IDENTITY_VAL_LOCAL(), '22701 creek ave', 19270);

仅当在具有标识列的表上执行IDENTITY_VAL_LOCAL()时,INSERT的值才会更改。像PREVIOUS VALUE一样,如果IDENTITY_VAL_LOCAL()在带有标识列的表上未以INSERT开头,则将返回null。并且也像PREVIOUS VALUE一样,INSERT必须与对IDENTITY_VAL_LOCAL()的调用在同一个工作中。

找到标识列和序列here的比较。