Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / вытянуть из insert значение вставленно по умолчанию / 25 сообщений из 35, страница 1 из 2
05.04.2006, 17:10
    #33647069
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Всем привет.
Есть таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create table obj (
id serial,
name varchar,
comment varchar,
class int,
PRIMARY KEY(id)
);
Где поле id имеет тип serial, т.е. по умолчанию принимает уникальное значение (обычно +1 от последнего)

Есть ХП
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace function cls_copy(int,varchar,varchar) returns boolean as
$$
declare
cls_id int;
begin
insert into obj (name,comment,class) values ($ 2 ,$ 3 , 1 );
cls_id=?????
return true;
end;
$$
language plpgsql;

Как в этой ХП получить в cls_id значение id только что вставленной
в таблицу obj строки.
При условии что поля name,comment,class могут быть не уникальными.
...
Рейтинг: 0 / 0
05.04.2006, 17:17
    #33647094
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Код: plaintext
1.
 p_id:= nextval('public.id_seq'::text) // твоя последовательность для id obj
 insert into obj (id,name,comment,class) values (p_id,$ 2 ,$ 3 , 1 );
...
Рейтинг: 0 / 0
05.04.2006, 17:19
    #33647101
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Большое спасибо!
...
Рейтинг: 0 / 0
05.04.2006, 18:45
    #33647344
.Guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
можно и "постфактум": сделать INSERT обычнам образом, т.е., без указания значения SERIAL-поля, а затем получить его текущее значение, вызвав функцию currval (по аналогии с nextval).
...
Рейтинг: 0 / 0
07.04.2006, 19:37
    #33653266
victor_kr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Если не ошибаюсь, то "постфактум" лучше не делать. :-) Может так получиться, что между операцией вставки и операцией получения текущего значения последовательности это текущее значение изменится. Т.к. последовательность одна для всех транзакций.
...
Рейтинг: 0 / 0
07.04.2006, 22:13
    #33653444
raul_83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Можно делать и curval - если вы просто напишете curval без вставки - вам выдаст ошибку - следовательно curval действует в пределах транзации и только после insert - если уровень изоляции транзакций по умолчанию
...
Рейтинг: 0 / 0
10.04.2006, 11:01
    #33655180
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
curval выдает последнее выделенное значение последовательности в текущей транзакции и абсолютно безопасен.
...
Рейтинг: 0 / 0
10.04.2006, 11:14
    #33655215
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Funny_Falconcurval выдает последнее выделенное значение последовательности в текущей транзакции и абсолютно безопасен.не совсем точно
currval
Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported if nextval has never been called for this sequence in this session.) Notice that because this is returning a session-local value, it gives a predictable answer whether or not other sessions have executed nextval since the current session did.
а "сессия" и "транзакция" - вещи разные.
например вполне работает в одном окне pgAdmina:
Код: plaintext
1.
2.
3.
4.
5.
6.
Begin;
SELECT nextval('t1_id_seq'::regclass);
rollback ; 

BEGIN;
SELECT currval('t1_id_seq'::regclass);
ROLLBACK;
причем счетчик наваривается независимо от ROLLBACK - ибо счетчики не транзакционны.
...
Рейтинг: 0 / 0
10.04.2006, 17:49
    #33656698
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Сори, облажался.
Но и смысла запрашивать curval, если случился rollback не вижу (думаю и не бывает так Ж-)
По-этому curval так и остается безопасным (если прямыми руками использовать).
...
Рейтинг: 0 / 0
10.04.2006, 20:56
    #33657037
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Не остается. Скажем, пока ты выполнял операцию вставки, джедай в соседней транзакции вызовет nextval. И currval вернет тебе не твое значение, а приросшее.
...
Рейтинг: 0 / 0
10.04.2006, 22:16
    #33657090
.Guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Кувалдин РоманНе остается. Скажем, пока ты выполнял операцию вставки, джедай в соседней транзакции вызовет nextval. И currval вернет тебе не твое значение, а приросшее.
Currval выдаст most recently obtained by nextval for this sequence in the current session . А не в "чужой" сессии. Не се па? Или я глубоко заблудился?
...
Рейтинг: 0 / 0
11.04.2006, 08:34
    #33657329
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Не, это я облажался :-)
...
Рейтинг: 0 / 0
11.04.2006, 10:30
    #33657574
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
не, ну я могу придумать, как кажецца можно навернуть логику с каррвал. Скажем - завести глобальный уникальный индификатор уровня базы на счетчике, а по вставке в какую-то табличку вызывать триггер "до вставки", порождающий вставку в другую табличку неких служебных объектов (т.е. в свою очередь наваривающих этот же глобальный уникальный индификатор.
дальше вроде все понятно но это довольно искусственный пример.
...
Рейтинг: 0 / 0
11.04.2006, 17:10
    #33659132
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
логику с некствал, я так понял тоже можно навернуть.
Так что особой разницы между курвал и некствал нет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
13.08.2007, 13:59
    #34723736
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
аналогичная проблема, но с тем, что есть UNIQUE поля. После INSERT-а (если он не удачен, т.е. UNIQUE VIOLATION по какому-то полю) - как получить id (serial) записи, которая вызвала VIOLATION? SELECT не предлагать. Не верю, что нельзя получить все поля записи, на которой возник UNIQUE VIOLATION без SELECT-а.
...
Рейтинг: 0 / 0
13.08.2007, 14:28
    #34723848
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
victor_krЕсли не ошибаюсь, то "постфактум" лучше не делать. :-) Может так получиться, что между операцией вставки и операцией получения текущего значения последовательности это текущее значение изменится. Т.к. последовательность одна для всех транзакций.

аналогично и nextval <здесь кто-то может влезть> insert
...
Рейтинг: 0 / 0
13.08.2007, 14:39
    #34723879
drunk2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Winnipuhаналогично и nextval <здесь кто-то может влезть> insertЕсли получили номер с помощью nextval никто уже не влезет и не заберет.
...
Рейтинг: 0 / 0
13.08.2007, 15:02
    #34723975
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Начиная с версии 8.2 появилась возможность сделать это без nextval() или currval() с помощью "INSERT ... RETURNING ...".
...
Рейтинг: 0 / 0
13.08.2007, 17:38
    #34724582
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
LeXa NalBatНачиная с версии 8.2 появилась возможность сделать это без nextval() или currval() с помощью "INSERT ... RETURNING ...".

это хорошо работает только если не возникло UNIQUE VIOLATION. При вставке с возникновением UNIQUE VIOLATION значение не возвращается.
Неужели без select-а никак?
...
Рейтинг: 0 / 0
13.08.2007, 18:18
    #34724713
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Robert Ayrapetyanэто хорошо работает только если не возникло UNIQUE VIOLATION. При вставке с возникновением UNIQUE VIOLATION значение не возвращается.
Неужели без select-а никак?

Поясните свой вопрос примером. Мне, например, сложно понять, что именно Вы хотите получить и в каком виде.
...
Рейтинг: 0 / 0
13.08.2007, 18:35
    #34724749
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Имеется таблица
...
Рейтинг: 0 / 0
13.08.2007, 18:39
    #34724762
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Имеется таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE families
(
  "FamilyID" integer NOT NULL DEFAULT nextval('"families_FamilyID_seq"'::regclass),
  "FamilyName" character varying( 100 ) NOT NULL,
  CONSTRAINT pk_families PRIMARY KEY ("FamilyID")
) 
WITHOUT OIDS;
ALTER TABLE families OWNER TO postgres;


-- Index: "Index_3"

-- DROP INDEX "Index_3";

CREATE UNIQUE INDEX "Index_3"
  ON families
  USING btree
  ("FamilyName");

Выполняется INSERT INTO families(FamilyName) VALUES (blablalba);

Необходимо: получить FamilyID в той записи, которая была вставлена, либо сгенерировала DUPLICATE VIOLATION.
...
Рейтинг: 0 / 0
13.08.2007, 18:54
    #34724799
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Robert Ayrapetyan Необходимо: получить FamilyID в той записи, которая была вставлена, либо сгенерировала DUPLICATE VIOLATION.очевидно, при ошиппке никакого FamilyID сгенерено не будет. ПО части наращивания счетчика, если произошло, спрашиваейте curval.
...
Рейтинг: 0 / 0
14.08.2007, 13:33
    #34726424
Nick Gazaloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
INSERT ... RETURNING ... не годится?
...
Рейтинг: 0 / 0
14.08.2007, 13:48
    #34726506
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вытянуть из insert значение вставленно по умолчанию
Nick GazaloffINSERT ... RETURNING ... не годится?
Чукча не читатель ....
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / вытянуть из insert значение вставленно по умолчанию / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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