Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / можно ли одной командой сделать insert/update / 9 сообщений из 9, страница 1 из 1
27.07.2007, 20:30
    #34690303
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
т.е. я не знаю существует ли запись, и хочу или апдейтнуть ее или если ен существует добавить.
в некоторых серверах такое есть.
...
Рейтинг: 0 / 0
28.07.2007, 00:57
    #34690475
Remach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
Нет. Сделайте триггер. Это уже обсуждалось тут .

P.S. PostgreSQL 8.1.3, PostgreSQL 7.4.1
...
Рейтинг: 0 / 0
30.07.2007, 11:07
    #34691922
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
хорошо, как вам такое решение, покритикуйте:

триггер before insert:
в нем удаляю запись с тем же ключом
далее идет вставка в любом случае

меня устроит такая последовательность.
Но как удалить, т.е.
delete from mytable where pkey= где взять ключ вставляемых записей? или вставляемой для триггера, который выполяется для каждой записи?
...
Рейтинг: 0 / 0
30.07.2007, 11:26
    #34692001
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
как вам такой триггер для данной задачи:

CREATE TRIGGER "xp_insert" BEFORE INSERT
ON "public"."xp" FOR EACH ROW
DELETE FROM xp
WHERE xprop.id in (select id from NEW);
...
Рейтинг: 0 / 0
30.07.2007, 11:36
    #34692050
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
Winnipuhкак вам такой триггер для данной задачи:

Код: plaintext
1.
2.
3.
CREATE TRIGGER "xp_insert" BEFORE INSERT
ON "public"."xp" FOR EACH ROW 
    DELETE FROM xp
    WHERE xprop.id in (select id from NEW);

гм. а каскадов не боитесь?
(вообще говоря - расстрел на месте без суда и следствия)
...
Рейтинг: 0 / 0
30.07.2007, 11:42
    #34692089
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
Winnipuhкак вам такой триггер для данной задачи:

CREATE TRIGGER "xp_insert" BEFORE INSERT
ON "public"."xp" FOR EACH ROW
DELETE FROM xp
WHERE xprop.id in (select id from NEW);
По идее можно и просто
Код: plaintext
1.
2.
3.
4.
CREATE TRIGGER "xp_insert" BEFORE INSERT
ON "public"."xp" FOR EACH ROW 
    DELETE FROM xp
    WHERE xprop.id=new.id);
Главный недостаток - это удаление, которое:
1. Влечет за собой каскады (или рестрикты), триггера на удаления, что может быть недопустимо/долго.
2. Разрастание БД, возможно разростание индексов и т.д.
...
Рейтинг: 0 / 0
30.07.2007, 11:49
    #34692116
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
Andrey Daeron Winnipuhкак вам такой триггер для данной задачи:

CREATE TRIGGER "xp_insert" BEFORE INSERT
ON "public"."xp" FOR EACH ROW
DELETE FROM xp
WHERE xprop.id in (select id from NEW);
По идее можно и просто
Код: plaintext
1.
2.
3.
4.
CREATE TRIGGER "xp_insert" BEFORE INSERT
ON "public"."xp" FOR EACH ROW 
    DELETE FROM xp
    WHERE xprop.id=new.id);
Главный недостаток - это удаление, которое:
1. Влечет за собой каскады (или рестрикты), триггера на удаления, что может быть недопустимо/долго.
2. Разрастание БД, возможно разростание индексов и т.д.

В данном случае у меня одна таблица без связей, так что с каскадом пробелм нет.
Правда такой триггер не создается, пишет ошибку, ему нужен execute только?


по пункту 2: почему же разрастание? я удаляю
...
Рейтинг: 0 / 0
30.07.2007, 12:56
    #34692426
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
Winnipuh Andrey Daeron
Главный недостаток - это удаление, которое:
1. Влечет за собой каскады (или рестрикты), триггера на удаления, что может быть недопустимо/долго.
2. Разрастание БД, возможно разростание индексов и т.д.

В данном случае у меня одна таблица без связей, так что с каскадом пробелм нет.
Правда такой триггер не создается, пишет ошибку, ему нужен execute только?

по пункту 2: почему же разрастание? я удаляю
1. Ну да , а сама функция может быть написана на SQL.
2. PG версионник, соответсвенно себя и ведет. Т.е. записи только помечаются как удаленные. При обновлении - в принципе тоже порождается новая версия как и при вставке, но по идее не всегда, или может быть на той же странице. Новые записи - всегда (или до вакуума?) идут в конец файла. Т.е. до VACUUM FULL/VACUUM таблицы будут разрастаться, и как следствие - будут расти индексы.
Если таблицы небольшие - то по большому счету пофиг.
...
Рейтинг: 0 / 0
30.07.2007, 23:59
    #34694298
Remach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли одной командой сделать insert/update
Триггерами пожалуйста. в 7.4.x делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE FUNCTION table_insert_legacy() RETURNS "trigger"
    AS '
    DECLARE
	cnt integer;
    BEGIN
	select into cnt count(*) from table where table.id = NEW.id 
        IF (cnt > 0) THEN
	    RAISE NOTICE  ''% exsits'', NEW.id;
	    UPDATE table set [...] WHERE table.id = NEW.id; -- simple update
            RETURN NULL;
        END IF;
        RETURN NEW;
    END;
'
    LANGUAGE plpgsql; 
 
CREATE TRIGGER table_insert_legacy
    BEFORE INSERT ON table
    FOR EACH ROW
    EXECUTE PROCEDURE table_insert_legacy();
Естественно, можно аналогичный триггер повесит и на BEFORE UPDATE, смотря что чаще происходит.

З.Ы. Говоря нет, я имел ввиду нельзя, используя только sql, одним запросом. Прошу прощения.
PostgreSQL 8.1.3, PostgreSQL 7.4.1
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / можно ли одной командой сделать insert/update / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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