plpgsql Funktion zum Einfügen eines Wertes

Von: , 26.05.2011 11:55 Uhr


Hallo,

Ich muss eine plpgsql Funktion schreiben, die etwas berechnet und diesen Wert dann in eine bestehende Tabellenspalte einfügt. Den Wert habe ich bereits berechnet, aber meine Funktion funktioniert leider noch nicht. postgres gibt mir folgende Fehlermeldung:

"null value in column "freundid" violates not-null constraint"


Meine Funktion sieht folgendermaßen aus:



CREATE OR REPLACE FUNCTION calculate_network(int) RETURNS int as $$
DECLARE
id ALIAS FOR $1;
a integer;
BEGIN
SELECT INTO a foo.count FROM (SELECT COUNT(freundvon)
FROM istbefreundetmit
WHERE freundschaftsgrad>8 AND befreundetmit=id) as foo;
INSERT INTO freunde(anzahl) VALUES (a);
END;
$$
language 'plpgsql';


Warum gibt postgres diese Fehlermeldung aus? Ich greife doch mit der Funktion garnicht auf "freundid" zu... Gibt es eine andere Möglichkeit die oben genannte Funktion zu schreiben?

Vielen Dank im Voraus!

Liebe Grüße,
Munis

9 Antworten zu dieser Frage

  1. Antwort von nach 47 Minuten 0 hilfreich
    Re: plpgsql Funktion zum Einfügen eines Wertes



    "null value in column "freundid" violates not-null constraint"
    Das bedeutet, dass freundid IMMER einen Wert enthalten muss.
    Du legst mit der Funktion einen neuen Datensatz an, schreibst aber in "freundid" keinen Wert.
    Darum gibt es imho den Fehler

    GrIngo

    • Antwort von nach 51 Minuten 0 hilfreich
      Re^2: plpgsql Funktion zum Einfügen eines Wertes

      Danke für die Antwort ^^

      Wie kann ich die Funktion denn umschreiben, dass kein neuer Datensatz angelegt wird, sondern der Wert Anzahl nur eingefügt wird?

      Liebe Grüße und vielen Dank,
      Munis

  2. Antwort von nach 5 Stunden 0 hilfreich
    Re: plpgsql Funktion zum Einfügen eines Wertes

    Hi Munis,
    die Fehermeldung besagt, dass versucht wurde, einen Datensatz zu erzeugen (oder zu ändern), ohne das Feld 'freundid' mit einem Wert zu versorgen. Die Tabellendefinition beinhaltet aber für dieses Feld eine not-null Bedingung, daher schlägt's fehl.
    Das einzige entspr. Statement in deiner Funktion ist
    INSERT INTO freunde
    ich vermute daher ganz stark, dass diese Tabelle eine Spalte 'freundid' enthält. Die musst du in dem INSERT ebenfalls versorgen, schätzungsweise mit der id, die als Param übergeben wird.
    INSERT INTO freunde(freundid, anzahl) VALUES (id, a);

    Gruß
    Thomas

    • Antwort von nach 8 Stunden 0 hilfreich
      Re^2: plpgsql Funktion zum Einfügen eines Wertes

      Hallo,

      Habe das so versucht und bekomme jetzt die Meldung:

      "duplicate key violates unique constraint "freunde_pkey"

      Scheint so, als würde postgres jetzt versuchen einen neuen Datensatz zu erzeugen, was natürlich nicht geht, da es so dann zwei Datensätze mit der selben freundid (dem Primärschlüssel) gibt. Gibt es denn eine Möglichkeit einfach nur den einen Wert anzahl in die Tabelle zu schreiben, wo er auch hingehört (also in den Datensatz, zu dem auch die entsprechende freundid gehört)?

      Liebe Grüße,
      Munis

      • Antwort von nach einem Tag 0 hilfreich
        Re^3: plpgsql Funktion zum Einfügen eines Wertes

        Hi,
        na dann haben meine Vermutungen ins blaue ja schon mal hingehauen ;)
        Wenn der Record in Tab. 'freunde' schon existiert, geht kein INSERT, sondern UPDATE:
        UPDATE freunde SET anzahl = a WHERE freundid = id

        oder - falls die Anzahl nur erhöht werden soll um den neuen Wert:
        ... SET anzahl = anzahl + a ...

        Gruß
        Thomas

  3. Antwort von nach 7 Stunden 0 hilfreich
    Re: plpgsql Funktion zum Einfügen eines Wertes

    INSERT INTO freunde(anzahl) VALUES (a);
    Anscheinend gibt es in der Tabelle "freunde" eine
    Spalte freundid, die nicht null sein darf, d.h.
    in diese musst Du auch einen Wert einfügen, z.B. so

    INSERT INTO freunde(freundid,anzahl) VALUES (id,a);

  4. Antwort von nach 16 Stunden 0 hilfreich
    Re: plpgsql Funktion zum Einfügen eines Wertes

    Leider kann ich hier keine Hilfe anbieten--plpgsql, was ist denn das? Es sieht wie Oracle-PL/SQL aus.

  5. Antwort von - abgemeldetes Mitglied - nach 3 Tagen 0 hilfreich
    Re: plpgsql Funktion zum Einfügen eines Wertes

    Hallo Munis,

    ich vermute, der Fehler liegt darin, dass in der Tabelle Freunde, in die der
    Wert für die Anzahl der Freunde eingetragen wird ein Schlüsselfeld mit namen
    FreundID existiert.
    (In deiner Anfrage steht leider nicht, in welcher Tabelle dieses Feld
    vorkommt.)
    Die Meldung hat nichts mit einem falschen Zugriff auf einen Wert zu tun,
    sondern mit einer versuchten Datensatz-Speicherung. Es fehlt das
    identifizierende Item.
    Das Insert-Statement müsste demnach um eine Spalte erweitert werden, in der
    ein Wert für das Feld FreundID steht.
    viel Erfolg,
    moehre

  6. Antwort von nach 7 Tagen 0 hilfreich
    Re: plpgsql Funktion zum Einfügen eines Wertes

    Hallo,

    du muss immer bei jedem Insert dafür sorgen das der Primery Key gefüllt ist und unterschiedlich. Die Freundid ist dein Primery Key und da steht möglicherweise eine laufende Nummer. Von Oracle kenne ich das, dass man eine Sequence anlegt und dann mit "nextval" eine neue Nummer zieht!

    Ich hoffe ich hab damit geholfen

    Schöne Grüße

    Werner Klocker

    Jetzt auf diese Frage antworten.