Plpgsql Funktion zum Einfügen eines Wertes

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

„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

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

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

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);

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

Hallo,

sorry, kann dir bei deinem Problem nicht weiterhelfen.

schönen Gruß
Stefan

Hallo Munis,

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?

Vielen Dank im Voraus!

Liebe Grüße,
Munis

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

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

Hi,
na dann haben meine Vermutungen ins blaue ja schon mal hingehauen :wink:
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

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

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