abap - 修改一个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.
所以这里的逻辑很简单,因为我在表中添加了值。你能解释一下修改一行的逻辑吗?
解决方案
数据库表没有“索引”。未指定表行的顺序。当您在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.
推荐阅读
- javascript - 在 JavaScript 中将字符串拆分为列表
- excel - Excel 中的平均值
- unit-testing - 如何在 nSubstitute 中模拟接口的只读“ushort”类型属性?
- laravel - Laravel ErrorException 数组到字符串的转换
- xslt - 收到“尚未声明命名空间前缀 'bin'”错误 - Saxon 的 XSL3
- excel - 将具有时间值 (hh:mm:ss) 的整列转换为文本时间 (hh:mm)
- rust - 检查宏中定义的项目中的功能标志
- python-3.x - 在 Python3 中如何使用一些浮点数和 range() 进行映射
- python - 向现有的 pandas 日期字段添加时间
- javascript - Chrome 扩展程序:主窗口关闭后 chrome.alarms 不起作用