Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получение параметров только что созданной записи, получение параметров созданной записи 
V
    Опции темы
Alexander06
Дата 4.6.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



 Здравствуйте, 
 у меня часто возникает задача добавить в таблицу запись, например в такую (postgreSQL)

Код

CREATE TABLE nodes
(
  "key" serial NOT NULL,
  "name" character varying(50) NOT NULL,
  CONSTRAINT nodes_pkey PRIMARY KEY (key)
)
WITH (OIDS=FALSE);


Причем на момент создания записи поле key не известно, оно заполняется счетчиком (serial)

В дальнейших запросах мне требуется этот ключ, поэтому я делаю выборку
Код

SELECT key FROM nodes WHERE name = 'ЗНАЧЕНИЕ_NAME';


И продолжаю работу (этот key используется как поле для другой таблицы, ссылающейся на nodes).

Отсюда вопрос:
Можно ли как-то упростить эту процедуру, сразу после INSERT получив ключ созданной записи?
Насколько я понимаю, это можно сделать хранимой процедурой, но я с ними не знаком...можно ли обойтись SQL?

Спасибо.
PM MAIL   Вверх
msr
Дата 5.6.2009, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.4.2009

Репутация: 1
Всего: 1



вариант номер раз
Код

insert into nodes("name") values('some_text');
select currval('nodes_key_seq');

вариант 2
Код

insert into nodes("name") values('some_text') returning key

PM MAIL   Вверх
Alexander06
Дата 5.6.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Спасибо, помоглоsmile

Пользуюсь возможностью сразу задать еще один вопрос.

предположим, что мне надо добавить очередную запись в nodes по условию.

Например, если nodes с name = "узел1" уже есть, то не выполнять INSERT.

Сейчас я это условие проверяю в программе перед INSERT.
PM MAIL   Вверх
msr
Дата 8.6.2009, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.4.2009

Репутация: 1
Всего: 1



можно создать триггер типа такого
Код

CREATE FUNCTION "nodes_BI_trf" () RETURNS trigger AS
$body$
BEGIN
if  EXISTS(select 1 from nodes n where new.name=n.name) then
    return null;
else
    return new;
end if;
END;
$body$
LANGUAGE 'plpgsql';


CREATE TRIGGER "nodes_BI_tr" BEFORE INSERT  
ON "public"."nodes" FOR EACH ROW 
EXECUTE PROCEDURE "nodes_BI_trf"();


PM MAIL   Вверх
Alexander06
Дата 8.6.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Ааа..я понял, если запись уже есть, то не выполнять INSERT.

Пожалуй, я все-таки напишу функцию для вставки, мне это проще для восприятия.

Спасибо, тема закрытаsmile

Это сообщение отредактировал(а) Alexander06 - 8.6.2009, 13:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.