首页 > 解决方案 > 修改一个db的db_table类型表

问题描述

我创建了一个带有 ID、名字、姓氏的数据库表。我创建了以下程序:

data: db_table type table of ztabletest. "Create my db data
select * from z6148tabletest into table db_table. "Fill my db data
data: modifiedLine type z6148tabletest. "Create my new line

modifiedLine-firstname = 'hey'.
modifiedLine-lastname = 'test'.

现在我想修改我的数据库表索引 2 中的行。

所以我正在尝试做类似的事情:

modify ztabletest from table db_table values modifiedLine at index 2.

我不明白修改的逻辑。

要插入我刚刚做的事情:

insert INTO ztabletest VALUES modifiedLine.

所以这里的逻辑很简单,因为我在表中添加了值。你能解释一下修改一行的逻辑吗?

标签: abap

解决方案


数据库表没有“索引”。未指定表行的顺序。当您在SELECT没有的情况下执行 a 时ORDER BY,数据库可以按照您感觉的任何顺序为您提供行。大多数 SQL 数据库往往总是给你相同的顺序,但这是为了它们的方便,而不是为了你。尤其是 SAP HANA 在这方面往往很喜怒无常。

但是数据库表确实有一个主键。主键可以被认为是每个表行的唯一标识符。因此,当您将主键设为数字时,您可以很好地模拟索引。我假设这是您的数据库列中字段“ID”的目的,因此您在定义数据库时将其标记为“键”。


当不存在具有相同键值的行时,INSERT添加一个新行。当已经有一个时,它会因 sy-subrc = 4 而失败。

modifiedLine-id = 2.
INSERT ztabletest FROM modifiedLine.

UPDATE更改具有相同键值的现有表行。当表中不存在具有这些主键值的行时,它会失败并显示 sy-subrc = 4。

modifiedLine-id = 2.
UPDATE ztabletest FROM modifiedLine.

SET或者用and替代更“传统的 SQL” 语法WHERE

UPDATE ztabletest 
  SET firstname = 'hey'
      lastname = 'test'
  WHERE id = 2

MODIFY是 INSERT 和 UPDATE 的组合(也称为“upsert”)。它检查线路是否已经存在。当它在那里时,它会修改该行。如果不是,它会插入它。

modifiedLine-id = 2.
MODIFY ztabletest FROM modifiedLine.

这基本上是以下的简写:

modifiedLine-id = 2.
UPDATE ztabletest FROM modifiedLine.
IF sy-subrc = 4.
    INSERT ztabletest FROM modifiedLine.
ENDIF.

推荐阅读