Tomasz N.

Tomasz N. Developer

Temat: Aktualizcja tabeli po insert i update

Witam,

Mam problem z polegający na napisaniu procedury, której zadaniem będzie dodanie dwóch wartości z dwóch kolumn i zaktualizowanie trzeciej kolumny.

Próbuje tak:

BEGIN
UPDATE public."produkty" SET razem = (SELECT ("cena" * "ile") FROM public."produkty"
END

Sam UPDATE działa prawidłowo ale nie wiem jak zrobić aby ewentualna aktualizacja kolumny Razem odbywała się tylko na wierszu w którym zmianie uległa wartość z pola Cena lub Ile. Nie ma potrzeby dokonywania UPDATE na całej tabeli.

Dzięki za pomoc.Ten post został edytowany przez Autora dnia 11.04.17 o godzinie 13:43

konto usunięte

Temat: Aktualizcja tabeli po insert i update

Całe stado problemów...

1) Dlaczemu, oj dlaczemu masz takie nazwy kolumn? Przez to musisz pisać nieustannie te " oraz ". jakbyś miał kolumny takie jak 'cena' oraz 'ile' to mógłbyś to napisać np. jako cena + ile. Poza tym w Razem jest błąd, bo pewnie chciałeś napisać "Razem", albo masz niezły bałagan.

2) Jak chcesz sprawdzić czy zmianie uległa wartość kolumny "Cena" albo "Ile"? Gdzie masz zapisane poprzednie wartości, albo gdzie masz pole z informacją, że coś się zmieniło? A odpowiadając na pytanie: jak nie masz, to nie możesz.
Tomasz N.

Tomasz N. Developer

Temat: Aktualizcja tabeli po insert i update

1. Tak masz racje powinno być "Razem"
2. Myślałem o Trigger - e dla insert lub update tylko jak to zrobić dla zmiany w wierszu.

konto usunięte

Temat: Aktualizcja tabeli po insert i update

Tak nieco bez sensu. Równie dobrze trigger może od razu aktualizować kolumnę "Razem".

I naprawde, zmień te nazwy kolumn, pisanie ciągle "Ile" zamiast ile jest koszmarne.


CREATE OR REPLACE FUNCTION something() RETURNS TRIGGER as $$
BEGIN
IF TG_OP = 'UPDATE' THEN
IF NEW."Cena" <> OLD."Cena" OR NEW."Ile" <> OLD."Ile" THEN
NEW."Razem" = NEW."Cena" + NEW."Ile";
END IF;
END IF;

IF TG_OP = 'INSERT' THEN
NEW."Razem" = NEW."Cena" + NEW."Ile";
END IF;

RETURN NEW;

END;
$$ LANGUAGE PLPGSQL;

CREATE TRIGGER something BEFORE INSERT OR UPDATE ON produkty
FOR EACH ROW EXECUTE PROCEDURE something();
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Aktualizcja tabeli po insert i update

Trzymanie takie kolumny w tabeli mija się z celem, skoro można ją obliczyć na podstawie innych kolumn. W innych bazach danych, powiedziałbym ci, abyś zrobił sobie "COMPUTED COLUMN", ale w postgreSQL nie ma takowych (pewnie jeszcze), choć można to "oszukać" za pomocą RULE.

Trigger można łatwiejszy niż zaproponował Szymon.
CREATE OR REPLACE FUNCTION something() RETURNS TRIGGER as $$
BEGIN
NEW."Razem" = Coalesce(NEW."Cena",0) * Coalesce(NEW."Ile",0);
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;

Tylko, że wtedy definicję triggera dajesz tylko na dwóch kolumnach:
CREATE TRIGGER tr
BEFORE INSERT OR UPDATE OF "Cena", "Ile"
ON produkty
FOR EACH ROW
EXECUTE PROCEDURE something();


Poza tym,l nikt nie zauważył, że powinno być "razy", a nie "dodać" :)
Tomasz N.

Tomasz N. Developer

Temat: Aktualizcja tabeli po insert i update

Panowie.

Dziękuję bardzo za cenne uwagi.
Z posgresql to moja pierwsza przygoda.
Wszystko działa aż miło patrzeć.

Ale idąc dalej potrzebuję jeszcze dodatkowo zsumować wszystkie wartości z kolumny Razem i zaktualizować je po polu LoginKierownika w kolumnie RazemPion.

LoginKierownika nie znam próbuje go poznać na podstawie rekordu w którym robiona jest aktualizacja:

NEW."RazemPion" = SUM(OLD."Razem") WHERE "Login" = (SELECT "Login" FROM public."produkty" WHERE OLD."Login")

Moja tabela wygląda następująco:

Id;LoginKierownika;NazwaPionu;Cena;Ile;Razem;RazemPion

Czy takie trriger-y nie będą zbyt ciężkie dla bazy która zawiera ok 35000 rekordów.

Dziękuję za pomoc.Ten post został edytowany przez Autora dnia 11.04.17 o godzinie 13:43
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Aktualizcja tabeli po insert i update

35 tys dla postgreSQL to jest nic. Nawet nie zdąży się rozkręcić :)
Mam tabele z milionami rekordów, na których działają po 2, 3 triggery wywołujące kaskadowo inne i musiałem sobie RAISE NOTICE powstawiać w środku, by mieć pewność, że się wykonało - tak szybko działają, że nawet żadnego spowolnienia nie odczułem.
Tomasz N.

Tomasz N. Developer

Temat: Aktualizcja tabeli po insert i update

W takim razie dla mnie to dobra wiadomość.

Następna dyskusja:

PostgreSQL - automatyzacja ...




Wyślij zaproszenie do