如果没有定义主键/唯一键/组合键,AS400数据库的唯一标识符?



问题:如何唯一标识AS400数据库中的记录

详细问题:

我有AS400数据库和其中的一些表。表没有定义主键/唯一键/组合键

就像oracle有ROWID的概念一样,我们也有AS400数据库的概念。或者我们可以创造一些类似ROWID的东西?

您所说的ROWID在DB2中称为RRN(相对记录号)。我不知道Oracle,但RRN只是一个伪静态值。根据表的创建,当删除或插入记录时,现有记录的值可能会发生变化。所讨论的设置是允许为新记录重用已删除的记录空间。

由于您没有说明如何访问记录(SQL或读/写API调用),因此您可能需要搜索现有的IBM文档,以便在特定用例中如何处理RRN值。

对于LUW,您可以修改派生表,但是如果您希望它是确定性的,您需要一些东西来唯一地确定每一行。另一方面,如果行是相同的,那么修改哪一行可能无关紧要。我不知道这是否适用于I系列,但您可以尝试以下操作:

create table t (a int not null, b int not null);
insert into t (a,b) values (1,1),(1,1),(1,1),(2,2),(3,3),(3,3);
select t.*, row_number() over (partition by a,b) as rn from t;
update (
select t.*, row_number() over (partition by a,b) as rn from t
) set b = 9 where rn = 1;
delete from (
select t.*, row_number() over (partition by a,b) as rn from t
) where rn > 1;
select t.*, row_number() over (partition by a,b) as rn from t;

小提琴

首先,您确定没有唯一密钥吗?在最初的AS/400上,一些人认为这是"最佳实践"。让您的物理文件(表)不带键,并在逻辑文件中定义唯一的键(也称为视图&指数).

Access Client Solutions工具的Schemas组件将允许您查看与表关联的任何索引(和关键逻辑文件);包含或不包含键是唯一的。

如果真的没有什么独特的,那么正确的答案是添加一个新的PK列。这很容易做到,而且不需要重新编译任何本地RPG/COBOL程序。这个过程基本上包括将数据移动到一个新表中。并将现有的PF/表重新创建为不包含新列的LF/视图。该过程在IBM红皮书"从数据库到用户界面以及两者之间的一切使IBM i应用程序现代化"中有详细介绍。

添加的新列可以是简单的标识列,也可以是实际的ROWID列。Db2 for IBM i实际上支持ROWID列,但它相对较新,并且与Oracle的列不同,它不存在于表中,除非您在创建表时添加或包含它。

相对记录号(RRN),一个显示物理行号的简单整数,在其他答案中提到可能是您"获取所有记录"的要求的有效解决方案,我想修改说1个特定的记录。

select rrn(a) as rowNbr, a.*
from mytable A;
update mytable A
set somefld = :newvalue
where rrn(a) = :rowNbr;

然而,你在另一个评论中提到你正在"发布kafka管道"中的记录。RRN不是一个好的解决方案,因为它可以改变和/或被重用。

相关内容

  • 没有找到相关文章

最新更新