nataraj: (Default)
[personal profile] nataraj
А как можно в одно SQL выражение в pg8, либо insert'нуть либо update'нуть строку в таблице, в зависимости от того есть ли уже строка с таким же значением в ключевом поле...

Если говорить на неком свободном диалекте, то хочется следующего:

MY_NAME=?;
MY_VALUE=?;
if count (select * from MY_TABLE where NAME=MY_NAME)>0
{
UPDATE NY_TABLE SET VALUE=MY_VALUE WHERE NAME=MY_NAME;
} else
{
insert into MY_TABLE (NAME, VALUE) values (MY_NAME, MY_VALUE);
};

Наверное это можно сделать на каком-нибудь PL/pgSQL.

А имеет ли смысл это делать там, или всю логику можно вынести во внешний перл, и не потерять ничего?

Date: 2008-02-11 02:33 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
В пределах одной транзакции делаешь апдейт, и смотришь чего DBI-ный execute вернул. Если вернул 0 (в смысле - ни одной строки не изменено), делаешь insert. Поскольку это в транзакции, ничего не теряешь.
Наоборот - нельзя. Потому что insert в случае конфликта обломится (а не просто вернет 0), а в Postgres ошибка внутри транзакции приводит к неработе всех последующих операторов в данной транзакции. До тех пор пока commi rollback не скажешь. А это не то, что нам нужно. Нам нужно чтобы операция была атоммарной, внутри одной транзакции.

Date: 2008-02-11 02:39 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
Угу... понял...

Слушай, а скажи, что бы почитать, чтобы про такие вещи прочитать? А то я понял, что в некоторых местах у меня категорические пробелы...
Edited Date: 2008-02-11 02:40 pm (UTC)

Date: 2008-02-11 02:41 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Читать "Введение в SQL" Мартина Гарднера и SQL for smarties Селко. А также документацию на DBI, Postgres и т.д.
И не просто читать а вдумчиво, рисуя в уме схему того как все это взаимодействует.

Date: 2008-02-11 03:09 pm (UTC)
From: [identity profile] beldmit.livejournal.com
MySQL такое умеет. REPLACE

Date: 2008-02-11 03:18 pm (UTC)
From: (Anonymous)
в принципе
insert into MY_TABLE (NAME, VALUE) values (MY_NAME, MY_VALUE);
UPDATE NY_TABLE SET VALUE=MY_VALUE WHERE NAME=MY_NAME;
как таковой вполне является решением твоей проблемы... если подумать - то это именно то, что ты требовал...

в частности leopard-book будет тебе подспорьем... http://www.pdfchm.com/book/programming-the-perl-dbi-4390/

Gor
P.S. хотя я сейчас подумал (не очень долго - но все равно приятно) - я неявно предполагал, что у тебя есть первичный ключ по NAME - на решение это никак не влияет, но если это так я не понимаю зачем ты
сравниваешь с >0 а не с =1
P.P.S. нет, не стоит выносить всю логику во внешний perl (те я не понимаю ради чего ты это хочешь сделать, сделавший именно так Витус превратил Оракл в Pg одним легким движением) если данное творение более-менее большое (это определяется скорее размером проекта, 20к исходников - с моей точки зрения водораздел
P.P.P.S. anyway - Коля! Коля! Коля! зачем ты читаешь всю таблицу? тебя же интересует только кол-во записей, сделай count(1) и успокойся.

Date: 2008-02-11 03:41 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
в частности leopard-book будет тебе подспорьем... http://www.pdfchm.com/book/programming-the-perl-dbi-4390/
О! пошел искать, качать, печатать ;-)

Date: 2008-02-11 04:44 pm (UTC)
From: (Anonymous)
именно там он качается, - одна книга сразу после регистрации, другая через час, третья - через 8, четвертая - через 48 (но на самом деле раньше случатся новые сутки и счетчик обнулится)
Gor


Date: 2008-02-11 05:03 pm (UTC)
ext_613079: Default userpic (Default)
From: [identity profile] shaplov.livejournal.com
именно там он качается, - одна книга сразу после регистрации,
Не... Оно качается с thepiratebay.org, в виде целого сидюка с книгами...

Gor
Эх... завел бы ты себе openID чтоли...

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 21st, 2026 09:04 am
Powered by Dreamwidth Studios