ERROR: duplicate key violates unique constraint "shortname_un"

KR

alive in new life
ERROR: duplicate key violates unique constraint "shortname_un"

moscowout=# UPDATE datatypes SET shortname='name', rus_name='blah-blah', eng_name='Name', description='blah-blah Name' WHERE datatypes_id=datatypes_update(0, 2);
ERROR: duplicate key violates unique constraint "shortname_un"
moscowout=# SELECT * FROM datatypes WHERE shortname='name';
datatypes_id | shortname | description | column_name | rus_name |
datatype_index | eng_name
--------------+-----------+-------------+-------------+----------+--------------
--+----------
(0 rows)

# описание таблицы
CREATE TABLE public.datatypes
(
datatypes_id serial NOT NULL,
shortname varchar(50),
description text,
column_name varchar(15),
rus_name varchar(50),
datatype_index int2 NOT NULL,
eng_name varchar(50),
CONSTRAINT data_types_id_pk PRIMARY KEY (datatypes_id),
CONSTRAINT shortname_un UNIQUE (shortname)
) WITH OIDS;

В фукнции datatypes_update используются только селекты без shortname
Как оказалось ругань на duplicate key violates происходит при любом shortname, которого заведомо нет и не может быть в таблице.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
локализуем ошибку: тот же самый запрос без вызова datatypes_update работает?
 

KR

alive in new life
Как оказалось работает.

Но ошибки я все равно не вижу, сама по себе функция работает как ожидается.
Привожу ее код.

CREATE OR REPLACE FUNCTION public.datatypes_update(int8, int4)
RETURNS int8 AS
'DECLARE
result INT8;
BEGIN
IF $1 > 0 THEN
RETURN $1;
ELSE
SELECT MIN(datatypes_id) INTO result FROM datatypes WHERE datatype_index=$2 AND shortname IS NULL;
IF NOT FOUND THEN
RAISE EXCEPTION \'error\';
END IF;
RETURN result;
END IF;
END;'
LANGUAGE 'plpgsql' VOLATILE;
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
я тоже ошибки не вижу... а нет ли у тебя ещё одной функции datatypes_update? что скажет команда
Код:
\df data*
в psql?
 

KR

alive in new life
moscowout=# \df data*
List of functions
Result data type | Schema | Name | Argument data types
------------------+--------+------------------+---------------------
bigint | public | datatypes_update | bigint, integer
(1 row)

Попробую обновить постгрес. Сейчас стоит 7.4.2
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
попробуй ещё включить запись в лог всех запросов и посмотреть, не выполняется ли чего-нибудь странного, что и вызывает ошибку.
 

KR

alive in new life
да вот как раз поднимал из сформированных скриптом дампов с выводом запросов.
Ошибка возникает именно при попытке обновления.
 

Strannik

Новичок
А что возвращает следующий запрос

SELECT * FROM datatypes WHERE datatypes_id=datatypes_update(0, 2);

???
 
Сверху