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

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

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

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

Также существует отношение n: 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 ]

0 голосов
/ 10 мая 2010

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

Как правило, вы решаете эту проблему, выполняя

SELECT sequencename.nextval FROM tablename

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

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

0 голосов
/ 05 мая 2010

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

...