CREATE TABLE sessions ( id "char" NOT NULL, "access" integer, DATA text, CONSTRAINT sessions_pkey PRIMARY KEY (id) )
Funkcja:
CREATE OR REPLACE FUNCTION updatesession(char, bigint, text) RETURNS void AS $$ DECLARE var_id alias FOR $1; var_access alias FOR $2; var_data alias FOR $3; BEGIN IF EXISTS(SELECT * FROM sessions WHERE id = var_id) THEN UPDATE sessions SET "access" = access, DATA = var_data WHERE id = var_id; ELSE INSERT INTO sessions (id, "access", DATA) VALUES(var_id, var_access, var_data ); END IF; RETURN; END; $$ LANGUAGE plpgsql;
Kod zapytania, próba dodania tej samej sesji czyli powinno ją nadpisać:
SELECT updatesession('hktf07v8not8ftcinff2oko0n2', 1232217089, 'lolz|s:4:"lolz";sda|s:3:"dfs";');
W rezultacie błąd:
Cytat
ERROR: duplicate key violates unique constraint "sessions_pkey"
Stan SQL:23505
Kontekst:SQL statement "INSERT INTO sessions (id, "access", data) VALUES( $1 , $2 , $3 )"
PL/pgSQL function "updatesession" line 13 at SQL statement
Stan SQL:23505
Kontekst:SQL statement "INSERT INTO sessions (id, "access", data) VALUES( $1 , $2 , $3 )"
PL/pgSQL function "updatesession" line 13 at SQL statement
Czemu warunek istnienia rekordu nie działa ? Długo już nad tym siedzę...
Rozwiązanie
Zły typ pola id, powinno być text