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?
„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
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);
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)?
vermutlich liegt es daran, dass in die Tabelle freunde ein INSERT gemacht werden soll, bei dem lediglich die Spalte anzahl belegt ist. Die Spalte freundid ist jedoch als NOT NULL deklariert - wahrscheinlich ist sie der Primärschlüssel.
Gruß
Erhard
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?
Hallo,
meiner Meinung nach hat die Tabelle „freunde“
mindestens eine weitere Spalte die not null ist,
somit muss bei einem Insert auch diese befüllt werden.
mfg
Wolfgang
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 …
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
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!