Thread: Re: [pgsql-ru-general] Возможно ли вставлять в несколько таблиц?

Привет,

31 октября 2011 г. 12:12 пользователь Dmitry E. Oboukhov <unera@debian.org> написал:
Если пишем

INSERT INTO table1 (a, b) VALUES (1, 2) RETURNING "id", '123' AS "name"

то возвращается результат вида

id | name
1  | 123
2  | 123
3  | 123

и так далее

Поскольку INSERT - SELECT работает то возникает соблазн написать

INSERT INTO table2 (table1_id, name)

   INSERT INTO table1 (a, b) VALUES (1, 2) RETURNING "id", '123' AS "name"


Но такая запись не работает. Говорит что синтаксическая ошибка на
втором INSERT. А в документации не вижу упоминания о том что в
качестве query нельзя применять INSERT.

И вот поскольку здесь есть некая двоякость в том к чему относится
RETURNING то я думаю, может я неправильно чет в синтаксисе делаю?
RETURNING ... не тоже самое, что SELECT ..., поэтому так
делать нельзя. Добиться желаемого эффекта можно
поместив INSERT ... RETURNING в функцию, возвращающую
требуемый набор столбцов (или композитный тип).

--
// Dmitriy.


2011/10/31 Dmitriy Igrishin <dmitigr@gmail.com>:
>> Поскольку INSERT - SELECT работает то возникает соблазн написать
>> INSERT INTO table2 (table1_id, name)
>>    INSERT INTO table1 (a, b) VALUES (1, 2) RETURNING "id", '123' AS "name"
>>
>> Но такая запись не работает. Говорит что синтаксическая ошибка на
>
> RETURNING ... не тоже самое, что SELECT ..., поэтому так
> делать нельзя. Добиться желаемого эффекта можно
> поместив INSERT ... RETURNING в функцию, возвращающую
> требуемый набор столбцов (или композитный тип).

Если 9.1, то для этого ещё можно использовать WITH с DML

http://www.postgresql.org/docs/9.1/static/queries-with.html#QUERIES-WITH-MODIFYING

--
Sergey Konoplev

Blog: http://gray-hemp.blogspot.com /
Linkedin: http://ru.linkedin.com/in/grayhemp /
JID/GTalk: gray.ru@gmail.com / Skype: gray-hemp



31 октября 2011 г. 13:11 пользователь Sergey Konoplev <gray.ru@gmail.com> написал:
2011/10/31 Dmitriy Igrishin <dmitigr@gmail.com>:
>> Поскольку INSERT - SELECT работает то возникает соблазн написать
>> INSERT INTO table2 (table1_id, name)
>>    INSERT INTO table1 (a, b) VALUES (1, 2) RETURNING "id", '123' AS "name"
>>
>> Но такая запись не работает. Говорит что синтаксическая ошибка на
>
> RETURNING ... не тоже самое, что SELECT ..., поэтому так
> делать нельзя. Добиться желаемого эффекта можно
> поместив INSERT ... RETURNING в функцию, возвращающую
> требуемый набор столбцов (или композитный тип).

Если 9.1, то для этого ещё можно использовать WITH с DML

http://www.postgresql.org/docs/9.1/static/queries-with.html#QUERIES-WITH-MODIFYING
Кстати да! Хорошая альтернатива!

--
// Dmitriy.