1

假设我有一个项目表,对于每个项目,可以为其存储额外的信息,这些信息会进入第二个表。附加信息由第一个表中的 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 语言的一部分作为标准操作(也许是,我只是不知道?)...

4

1 回答 1

2

我正在寻找的语法是:

SELECT * FROM NEW TABLE ( INSERT INTO phone_book VALUES ( 'Peter Doe','555-2323' ) )

来自维基百科(http://en.wikipedia.org/wiki/Insert_%28SQL%29

这是如何引用刚刚插入表中的记录。

我的同事将此构造称为“就地触发器”,它的真正含义是……

这是我作为复合 SQL 语句组合在一起的第一个版本:

begin atomic
declare addtl_id integer;
set addtl_id = (select item_addtl_info_id from item where item.item_id = XXX);
if addtl_id is null
then
    set addtl_id = (select addtl_info_id from new table 
                    (insert into addtl_info
                        (addtl_info_text)
                        values ('My brand new additional info')
                    )
                  );
    update item set item.item_addtl_info_id = addtl_id
    where item.item_id = XXX;

else
   update addtl_info set addtl_info_text = 'My updated additional info'
   where addtl_info.addtl_info_id = addtl_id;
end if;
end

XXX等于要更新的​​项目 id - 现在可以轻松地将这段代码插入到存储过程中,并且可以将XXX转换为输入参数。

我也尝试过使用 MERGE INTO,但我无法弄清楚用于更新与指定为目标的表不同的表的语法。

于 2011-04-11T13:40:43.477 回答