Как вставить n:m-связь с техническими первичными ключами, сгенерированными последовательностью?

Допустим, у меня есть две таблицы с несколькими полями, и в каждой таблице есть первичный ключ, который является техническим идентификатором, сгенерированным последовательностью базы данных:

table1             table2
-------------      -------------
field11  <pk>      field21  <pk>
field12            field22

field11 а также field21 генерируются последовательностями.

Также существует: m-связь между table1 унд table2, разработанный в table3:

table3
-------------
field11  <fk>
field21  <fk>

Идентификаторы в table1 унд table2 генерируются во время оператора вставки:

INSERT INTO table1 VALUES (table1_seq1.NEXTVAL, ...
INSERT INTO table2 VALUES (table2_seq1.NEXTVAL, ...

Поэтому я не знаю первичный ключ добавленной строки на уровне доступа к данным моей программы, потому что генерация pk происходит полностью в базе данных.

Как лучше всего обновлять table3 сейчас? Как я могу получить доступ к первичному ключу строк, которые я только что вставил?

2 ответа

Решение

Если вы столкнулись с этой проблемой и используете инфраструктуру Ibator Ibatis в качестве DAO-уровня (как мы это делаем), вы можете справиться с этим делом, используя <generated-key>-tag в ibator.config.

В общем, вы решаете эту проблему, делая

SELECT sequencename.nextval FROM tablename

на столе имени tablename используя последовательность sequencename чтобы получить следующий ключ для значений для вставки.

PS: здесь нет необходимости обращать внимание на обработку транзакций, потому что следующий вызов nextval-функция вернет следующее значение последовательности.

У вас нет другого (не суррогатного) ключа-кандидата для этих таблиц? В общем случае не очень полезно делать суррогатный ключ в качестве единственного ключа любой таблицы. Предполагая, что у вас есть какой-то другой ключ, вы можете использовать его для получения вставленных строк.

Другие вопросы по тегам