Вопрос про sql
Feb. 11th, 2008 05:00 pmА как можно в одно 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.
А имеет ли смысл это делать там, или всю логику можно вынести во внешний перл, и не потерять ничего?
Если говорить на неком свободном диалекте, то хочется следующего:
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.
А имеет ли смысл это делать там, или всю логику можно вынести во внешний перл, и не потерять ничего?
no subject
Date: 2008-02-11 02:33 pm (UTC)Наоборот - нельзя. Потому что insert в случае конфликта обломится (а не просто вернет 0), а в Postgres ошибка внутри транзакции приводит к неработе всех последующих операторов в данной транзакции. До тех пор пока commi rollback не скажешь. А это не то, что нам нужно. Нам нужно чтобы операция была атоммарной, внутри одной транзакции.
no subject
Date: 2008-02-11 02:39 pm (UTC)Слушай, а скажи, что бы почитать, чтобы про такие вещи прочитать? А то я понял, что в некоторых местах у меня категорические пробелы...
no subject
Date: 2008-02-11 02:41 pm (UTC)И не просто читать а вдумчиво, рисуя в уме схему того как все это взаимодействует.
no subject
Date: 2008-02-11 03:09 pm (UTC)no subject
Date: 2008-02-11 03:18 pm (UTC)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) и успокойся.
no subject
Date: 2008-02-11 03:41 pm (UTC)О! пошел искать, качать, печатать ;-)
no subject
Date: 2008-02-11 04:44 pm (UTC)Gor
no subject
Date: 2008-02-11 05:03 pm (UTC)Не... Оно качается с thepiratebay.org, в виде целого сидюка с книгами...
Gor
Эх... завел бы ты себе openID чтоли...