Как сделать грамотный инсерт большого кол-ва записей в две связанны таблицы

BoJlxB
Дата: 19.08.2003 15:05:00
Есть две связанные таблицы.
Вставку во вторую таблицу можно сделать только после того как узнаю автоинкрементированное значения id первой таблицы. Либо используя функцию nextval сначало узнать новое id, а потом вставлять сразу в две таблицы с этим id.

Проблема: если втавляю, допустип, 100 записей в первую таблицу, то мне нужно сначало сделать 100 раз nextval. И только потом все инсёрты (в одном запросе).
А можно ли как-нибудь сократить кол-во запросов к базе (не делать 100 раз nextval)?

P.S.: блокировку таблицы делать нельзя.
Vel
Дата: 19.08.2003 18:36:45
По-моему НУЖНО делать блокировку.
А так делаешь один раз nextval, счетчик держишь у себя.
Вставляешь данные через COPY (insert дольше) не по одной записи, а все сразу. Сначала в одну, потом в другую.
потом пишешь что-то типа этого:
SELECT pg_catalog.setval ('_s_rating_seq', 20149, true); - таблица, новое значение сиквенса, обновить. А счетчик в проге/sql/руками.
Sad Spirit
Дата: 19.08.2003 22:58:16
Если я правильно понял задачу, то:

[code]
BEGIN WORK;
INSERT INTO table1 (...) VALUES (...);
INSERT INTO table2 ("foreign key", ...) VALUES (currval('table1_sequence'), ...);
-- повторить ещё 99 раз

COMMIT WORK;
[/code]
BoJlxB
Дата: 20.08.2003 07:08:17
Спасибо за ответы!
Но у вас обоих используется блокировка таблиц, но я её не могу делать.

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

2Sad Spirit:
Теже возражения, но здесь время сжимается до минимума, т.е. время между:
INSERT INTO table1 (...) VALUES (...);
и
INSERT INTO table2 ("foreign key", ...) VALUES (currval('table1_sequence'), ...);
Как вы думаете этим временем можно пренебречь?
BoJlxB
Дата: 20.08.2003 09:47:47
2Sad Spirit:
Я тут узнал что: "currval существует во время одного запроса и выдается именно ему".

Спасибо, ваш вариант полностью подходит!