Tabela:
  1. CREATE TABLE sessions
  2. (
  3. id "char" NOT NULL,
  4. "access" integer,
  5. DATA text,
  6. CONSTRAINT sessions_pkey PRIMARY KEY (id)
  7. )

Funkcja:
  1. CREATE OR REPLACE FUNCTION updatesession(char, bigint, text) RETURNS void AS $$
  2. DECLARE
  3.  
  4. var_id alias FOR $1;
  5. var_access alias FOR $2;
  6. var_data alias FOR $3;
  7.  
  8. BEGIN IF EXISTS(SELECT * FROM sessions WHERE id = var_id) THEN
  9. UPDATE sessions
  10. SET "access" = access, DATA = var_data WHERE id = var_id;
  11. ELSE
  12. INSERT INTO sessions (id, "access", DATA) VALUES(var_id, var_access, var_data );
  13. END IF;
  14. RETURN;
  15. END;
  16. $$ LANGUAGE plpgsql;

Kod zapytania, próba dodania tej samej sesji czyli powinno ją nadpisać:
  1. 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


Czemu warunek istnienia rekordu nie działa ? Długo już nad tym siedzę...


Rozwiązanie

Zły typ pola id, powinno być text