Lists: | pgsql-ru-general |
---|
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Возможно ли вставлять в несколько таблиц? |
Date: | 2011-10-31 08:12:47 |
Message-ID: | 20111031081246.GA24714@apache.rbscorp.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
Если пишем
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 то я думаю, может я неправильно чет в синтаксисе делаю?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
From: | Dmitriy Igrishin <dmitigr(at)gmail(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 08:25:57 |
Message-ID: | CAAfz9KP4RqniSGF8-pZ4eZFkp_XPWydaOBTs-5fY6pqDM+kV3Q@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | Postg토토 사이트 순위SQL |
Привет,
31 октября 2011 г. 12:12 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)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.
From: | Sergey Konoplev <gray(dot)ru(at)gmail(dot)com> |
---|---|
To: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
Cc: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>, pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Возможно ли вставлять в несколько таблиц? |
Date: | 2011-10-31 09:11:55 |
Message-ID: | CAL_0b1tALwibdvQONQPwJDoaYwvwj7L6OXB99v6aQ3+qTw_=Kg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
2011/10/31 Dmitriy Igrishin <dmitigr(at)gmail(dot)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(dot)ru(at)gmail(dot)com / Skype: gray-hemp
From: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
---|---|
To: | Sergey Konoplev <gray(dot)ru(at)gmail(dot)com> |
Cc: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>, pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: [pgsql-ru-general] Возможно ли вставлять в несколько таблиц? |
Date: | 2011-10-31 09:20:16 |
Message-ID: | CAAfz9KMJsMKuYENmro9JWNPvH364=z6t-ePQ2eeeJtsk1-_fag@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
31 октября 2011 г. 13:11 пользователь Sergey Konoplev
<gray(dot)ru(at)gmail(dot)com>написал:
> 2011/10/31 Dmitriy Igrishin <dmitigr(at)gmail(dot)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.
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 |
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: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: Re: [pgsql-ru-general] Возможно ли вставлять в несколько таблиц? |
Date: | 2011-10-31 11:05:08 |
Message-ID: | 20111031110508.GB24714@apache.rbscorp.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
> Даже если заключить второе выражение в скобки и поставить 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
Спасибо!
Хороший повод съехать на 9.1
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537