假设我有一个项目表,对于每个项目,可以为其存储额外的信息,这些信息会进入第二个表。附加信息由第一个表中的 FK 引用,可以为 NULL(如果项目没有附加信息)。
TABLE item (
...
item_addtl_info_id INTEGER
)
CONSTRAINT fk_item_addtl_info FOREIGN KEY (item_addtl_info)
REFERENCES addtl_info (addtl_info_id)
TABLE addtl_info (
addtl_info_id INTEGER NOT NULL
GENERATED BY DEFAULT
AS IDENTITY (
INCREMENT BY 1
NO CACHE
),
addtl_info_text VARCHAR(100)
...
CONSTRAINT pk_addtl_info PRIMARY KEY (addtl_info_id)
)
更新项目的附加信息(最好是在 IBM DB2 SQL 中)的“最佳实践”是什么?
它应该是一个 UPSERT 操作,这意味着如果附加信息尚不存在,则在第二个表中创建一条新记录,但如果存在,则仅更新它,并且第一个表中的 FK 不会更改。
因此,势在必行,这是逻辑:
UPSERT(item, item_info):
CASE WHEN item.item_addtl_info_id IS NULL THEN
INSERT INTO addtl_info (item_info)
UPDATE item.item_addtl_info_id (addtl_info.addtl_info_id)
^^^^^^^^^^^^^
ELSE
UPDATE addtl_info (item_info)
END
我的主要问题是如何获取新插入的 addtl_info 行的 id(上面加下划线)。在存储过程中,我可以从序列中请求 id 并将其存储在变量中,但也许有更直接的方法。在编写数据库时,这不是一直出现的东西吗?
我的意思是,只要 addtl_info 记录的 id 保持唯一并且被正确引用,我真的不感兴趣。所以在这种情况下,使用序列对我来说似乎有点矫枉过正。
事实上,这个 UPSERT 操作应该是 SQL 语言的一部分作为标准操作(也许是,我只是不知道?)...