Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как сделать грамотный инсерт большого кол-ва записей в две связанны таблицы / 5 сообщений из 5, страница 1 из 1
19.08.2003, 15:05
    #32240478
BoJlxB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать грамотный инсерт большого кол-ва записей в две связанны таблицы
Есть две связанные таблицы.
Вставку во вторую таблицу можно сделать только после того как узнаю автоинкрементированное значения id первой таблицы. Либо используя функцию nextval сначало узнать новое id, а потом вставлять сразу в две таблицы с этим id.

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

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

Код:
1.
2.
3.
4.
5.
6.
BEGIN WORK;
INSERT INTO table1 (...) VALUES (...);
INSERT INTO table2 ("foreign key", ...) VALUES (currval('table1_sequence'), ...);
-- повторить ещё 99 раз

COMMIT WORK;
...
Рейтинг: 0 / 0
20.08.2003, 07:08
    #32241022
BoJlxB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать грамотный инсерт большого кол-ва записей в две связанны таблицы
Спасибо за ответы!
Но у вас обоих используется блокировка таблиц, но я её не могу делать.

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

2Sad Spirit:
Теже возражения, но здесь время сжимается до минимума, т.е. время между:
INSERT INTO table1 (...) VALUES (...);
и
INSERT INTO table2 ("foreign key", ...) VALUES (currval('table1_sequence'), ...);
Как вы думаете этим временем можно пренебречь?
...
Рейтинг: 0 / 0
20.08.2003, 09:47
    #32241175
BoJlxB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать грамотный инсерт большого кол-ва записей в две связанны таблицы
2Sad Spirit:
Я тут узнал что: "currval существует во время одного запроса и выдается именно ему".

Спасибо, ваш вариант полностью подходит!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как сделать грамотный инсерт большого кол-ва записей в две связанны таблицы / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]