Допустим, у меня есть таблица предметов, и для каждого предмета может быть сохранена дополнительная информация, которая попадает во вторую таблицу. На дополнительную информацию ссылается 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 (подчеркнуто выше). В хранимой процедуре я могу запросить идентификатор из последовательности и сохранить его в переменной, но, возможно, есть более простой способ. Разве это не то, что все время возникает при программировании баз данных?
Я имею в виду, меня действительно не интересует, какой идентификатор записи addtl_info остается уникальным и на который ссылаются должным образом. Поэтому использование последовательностей в данном случае кажется мне излишним.
На самом деле эта операция UPSERT должна быть частью языка SQL как стандартная операция (может быть, и я просто не знаю об этом?) ...