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