我有标题和详细信息表,并且那些1:N之间的关系 这两个表都有自动SEQ号字段,我想使用某种技术将这两个表链接起来,以便我可以追溯。 我有两种解决方案,如果您从其中一个或另一个更好的选择中获得建议,则需要您的帮助。
(1)使用数据区并存储一个10000000开头,并为每个标题插入和多个详细信息插入获取它...增加数量并更新数据区。(在这种情况下,两个表都将具有自己的自动SEQ数字和链接的密钥) (2)在插入记录的同时获取标头表SEQ号,并将其用作明细表中的关键字。 (在这种情况下,标头将具有自动seq键,而明细表将具有自动SEQ键和链接键作为标头表的自动键)
请告知。
谢谢
答案 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 VALUE
和PREVIOUS VALUE
的行为与您期望的一样,即使多个作业使用相同的顺序。作业1将无权访问作业2的生成值,反之亦然。但这意味着根据序列的定义方式,序列号中可能会留有空白,或者序列中可能会出现空白。请务必阅读我提供的两个参考资料,以进行更深入的解释。
如果您不想直接在插入内容中使用NEXT VALUE
,也可以像这样使用VALUES INTO
:
VALUES NEXT VALUE FOR NEXT_ORDER_NO INTO :<local variable>
您可以在Knowledge Center中找到有关此语句的更多信息。
作为序列的替代方法,您可以使用一个身份列(根据您的注释,这似乎是您想要的),但是您不必在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的比较。