当FK引用行时执行UPSERT

时间:2011-04-11 13:00:36

标签: sql db2 upsert

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

1 个答案:

答案 0 :(得分: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 可以转换为输入参数。< / p>

我也尝试过使用MERGE INTO,但我无法找到更新表格的语法,不同于指定的目标。