Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запись в связанные таблицы в одном запросе / 12 сообщений из 12, страница 1 из 1
02.09.2008, 17:41
    #35518763
rockclimber
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
Надо внести данные в две связанные таблицы в одном запросе или в нескольких, но без записывания промежуточных результатов во внешнем хранилище.
Выглядит это так. Создаем новую запись в таблице:
Код: plaintext
insert into table1 (col1, col2, col3) values ( 1 ,  2 ,  3 )
Ключевое поле - table1_id.
Есть вторая таблица table2, которая связана с первой через поле table2.table1_id.
Чтобы создать новую запись, надо составить запрос:
Код: plaintext
insert into table2 (table1_id, col4, col5, col6) values (xxx,  1 ,  2 ,  3 )
где вместо xxx поставить значение поля table1.table1_id, которое было задано автоматически при выполнении 1-го запроса. Желательно второй запрос отправлять одновременно или почти одновременно. Вопрос - как это сделать?
...
Рейтинг: 0 / 0
02.09.2008, 17:54
    #35518792
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
rockclimberНадо внести данные в две связанные таблицы
Код: plaintext
insert into table1 (col1, col2, col3) values ( 1 ,  2 ,  3 )
Код: plaintext
insert into table2 (table1_id, col4, col5, col6) values (xxx,  1 ,  2 ,  3 )
посмотрите INSERT RETURNING

rockclimberЖелательно второй запрос отправлять одновременно или почти одновременно.делайте в одной транзакции
...
Рейтинг: 0 / 0
02.09.2008, 18:18
    #35518832
rockclimber
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
Спасибо, то что нужно.
LeXa NalBat rockclimberЖелательно второй запрос отправлять одновременно или почти одновременно.делайте в одной транзакции
Это не так принципиально, я имел ввиду обойтись без системы типа "insert into t1 ... " -> "select ... from t1 ... " -> "insert... into t2".
...
Рейтинг: 0 / 0
02.09.2008, 18:45
    #35518886
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
если table1.table1_id - serial то можно просто получить текущее значение sequence, например так:
Код: plaintext
1.
insert into table1 (col1, col2, col3) values ( 1 ,  2 ,  3 );
insert into table2 (table1_id, col4, col5, col6) values (currval(pg_get_serial_sequence('table1', 'table1_id')),  1 ,  2 ,  3 );
...
Рейтинг: 0 / 0
03.09.2008, 09:54
    #35519490
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
rockclimberя имел ввиду обойтись без системы типа "insert into t1 ... " -> "select ... from t1 ... " -> "insert... into t2".INSERT RETURNING не подходит?
...
Рейтинг: 0 / 0
03.09.2008, 11:35
    #35519829
rockclimber
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
LeXa NalBat rockclimberя имел ввиду обойтись без системы типа "insert into t1 ... " -> "select ... from t1 ... " -> "insert... into t2".INSERT RETURNING не подходит?
Я же сказал, rockclimberСпасибо, то что нужно.
:)
...
Рейтинг: 0 / 0
03.09.2008, 11:39
    #35519836
rockclimber
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
А, дошло!
Короче, когда я говорил: авторобойтись без системы типа "insert into t1 ... " -> "select ... from t1 ... " -> "insert... into t2".
Я имел ввиду совместить первый insert c select'ом, что и делает insert returning...
...
Рейтинг: 0 / 0
03.09.2008, 20:18
    #35521307
chAlx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
Ёшесли table1.table1_id - serial то можно просто получить текущее значение sequence, например так:
Код: plaintext
1.
insert into table1 (col1, col2, col3) values ( 1 ,  2 ,  3 );
insert into table2 (table1_id, col4, col5, col6) values (currval(pg_get_serial_sequence('table1', 'table1_id')),  1 ,  2 ,  3 );

Между этими вставками сиквенс обязатеьлно успеет измениться! ;)
...
Рейтинг: 0 / 0
04.09.2008, 10:10
    #35521688
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
chAlx Ёшесли table1.table1_id - serial то можно просто получить текущее значение sequence, например так:
Код: plaintext
1.
insert into table1 (col1, col2, col3) values ( 1 ,  2 ,  3 );
insert into table2 (table1_id, col4, col5, col6) values (currval(pg_get_serial_sequence('table1', 'table1_id')),  1 ,  2 ,  3 );

Между этими вставками сиквенс обязатеьлно успеет измениться! ;)нет, вариант с currval правильный

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table t1 ( id serial, name text );

-- 1
begin;
insert into t1 ( name ) values ( 'foo' );
select currval( pg_get_serial_sequence( 't1', 'id' ) );

        -- 2
        begin;
        insert into t1 ( name ) values ( 'bar' );
        select currval( pg_get_serial_sequence( 't1', 'id' ) );
        commit;

select currval( pg_get_serial_sequence( 't1', 'id' ) );
commit;

drop table t1;
...
Рейтинг: 0 / 0
09.09.2008, 21:46
    #35530846
DAISER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
LeXa NalBatнет, вариант с currval правильный

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table t1 ( id serial, name text );

-- 1
begin;
insert into t1 ( name ) values ( 'foo' );
select currval( pg_get_serial_sequence( 't1', 'id' ) );

        -- 2
        begin;
        insert into t1 ( name ) values ( 'bar' );
        select currval( pg_get_serial_sequence( 't1', 'id' ) );
        commit;

select currval( pg_get_serial_sequence( 't1', 'id' ) );
commit;

drop table t1;

Если между INSERT в первую таблицу (берется nextval) и во вторую таблицу (берется currval) проскочит ещё один (или несколько) nextval по тому же сиквенсу из другой сессии? currval-то изменится.
...
Рейтинг: 0 / 0
10.09.2008, 01:23
    #35530980
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
нет, не изменится.

currval - это не текущее общесистемное значение. currval - это то что вернул предыдущий nextval в этой сессии (в этом подключении). то есть это запомненное значение и оно не меняется при изменении секвенса соседними подключениями. оно меняется только при вызове nextval в этой сессии.

Код: plaintext
1.
2.
3.
4.
seb=> create sequence aaa;
CREATE SEQUENCE
seb=> select currval('aaa');
ERROR:  currval (текущее значение) последовательности "aaa" ещё не определено в этой сессии
обратите внимание на слова "currval (текущее значение)" и "в этой сессии".


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
10.09.2008, 09:17
    #35531138
DAISER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись в связанные таблицы в одном запросе
Ёшcurrval - это не текущее общесистемное значение. currval - это то что вернул предыдущий nextval в этой сессии (в этом подключении). то есть это запомненное значение и оно не меняется при изменении секвенса соседними подключениями. оно меняется только при вызове nextval в этой сессии.Проверил. Действительно. Ой :)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запись в связанные таблицы в одном запросе / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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