From: | Alexey Klyukin <alexeyk(at)me(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Возможно ли вставлять в несколько таблиц? |
Date: | 2011-10-31 09:28:29 |
Message-ID: | FE61FFAE-49B5-4615-BC5C-126E775814C9@me.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
On Oct 31, 2011, at 10:12 AM, Dmitry E. Oboukhov wrote:
> Если пишем
>
> 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 то я думаю, может я неправильно чет в синтаксисе делаю?
Даже если заключить второе выражение в скобки и поставить SELECT, работать
оно не будет. RETURNING возвращает выражение, похожее на SELECT, но не
создает промежуточный множество, которое можно использовать как вложенный
запрос. В 9.1 появилась поддержка writeable CTE, которые используют RETURNING
и позволяют реализовать INSERT сразу в 2 таблицы без процедур, например:
CREATE TABLE foo(a integer, b integer);
CREATE TABLE bar(a integer, b integer);
WITH insert_foo AS
(INSERT INTO foo SELECT id, id * (-1)
FROM generate_series(200,300) id RETURNING *)
INSERT INTO bar SELECT * FROM insert_foo;
Отличие в том, что CTE как раз создает промежуточную таблицу результатов выражения
внтури WITH. К сожалению, это доступно только с 9.1
/A
From | Date | Subject | |
---|---|---|---|
Next Message | Dmitry E. Oboukhov | 2011-10-31 11:05:08 | Re: Re: [pgsql-ru-general] Возможно ли вставлять в несколько таблиц? |
Previous Message | Dmitriy Igrishin | 2011-10-31 09:20:16 | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Возможно ли вставлять в несколько таблиц? |