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