Операторный класс

Здравствуйте!
Недавно начил использовать Postgre и столкнулся со следующей проблемой:
Определил свой тип (достаточно простой)
CREATE TYPE ibpc AS (
place integer,
code integer
);
создал таблицу, определил в ней поле типа ibpc и хочу его сделать первичным ключом, на что получаю ошибку с предложением определить операторный класс по умолчанию. Умом понимаю, что для построения индекса нового типа мне нужно определить операторы сравнения, как это сделать я понял (CREATE OPERATOR) на примере =, но как определить операторный класс???

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Вопрос снят - разобрался

Почитал документация и разобрался.
Если кому интересно, то это делается примерно так

CREATE TYPE ibpc AS
(
place integer,
code integer
);

-- agr1 = arg2
CREATE OR REPLACE FUNCTION is_equal(ibpc, ibpc)
RETURNS boolean AS
'SELECT ($1.place=$2.place) AND ($1.code=$2.code)'
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION is_equal(ibpc, ibpc) OWNER TO enterprisedb;
COMMENT ON FUNCTION is_equal(ibpc, ibpc) IS 'определяет равенство двух величин типа ibpc';

-- agr1 > arg2
CREATE OR REPLACE FUNCTION is_gt(ibpc, ibpc)
RETURNS boolean AS
'SELECT ($1.place>$2.place) OR (($1.place=$2.place) AND ($1.code>$2.code))'
LANGUAGE 'sql' VOLATILE;
COMMENT ON FUNCTION is_gt(ibpc, ibpc) IS 'определяет больше ли первый аргумент типа ibpc второго';

-- agr1 >= arg2
CREATE OR REPLACE FUNCTION is_ge(ibpc, ibpc)
RETURNS boolean AS
'SELECT ($1.place>$2.place) OR (($1.place=$2.place) AND ($1.code>=$2.code))'
LANGUAGE 'sql' VOLATILE;
COMMENT ON FUNCTION is_ge(ibpc, ibpc) IS 'определяет больше или равен первый аргумент типа ibpc второго';

-- agr1 < arg2
CREATE OR REPLACE FUNCTION is_lt(ibpc, ibpc)
RETURNS boolean AS
'SELECT ($1.place<$2.place) OR (($1.place=$2.place) AND ($1.code<$2.code))'
LANGUAGE 'sql' VOLATILE;
COMMENT ON FUNCTION is_lt(ibpc, ibpc) IS 'определяет меньше ли первый аргумент типа ibpc второго';

-- agr1 <= arg2
CREATE OR REPLACE FUNCTION is_le(ibpc, ibpc)
RETURNS boolean AS
'SELECT ($1.place<$2.place) OR (($1.place=$2.place) AND ($1.code<=$2.code))'
LANGUAGE 'sql' VOLATILE;
COMMENT ON FUNCTION is_le(ibpc, ibpc) IS 'определяет меньше или равен первый аргумент типа ibpc второго';

-- compare (agr1, arg2)
CREATE OR REPLACE FUNCTION ibpc_cmp(ibpc, ibpc) RETURNS integer AS
'BEGIN
IF ($1.place<$2.place) THEN
RETURN -1;
ELSE IF ($1.place>$2.place) THEN
RETURN 1;
ELSE IF ($1.code<$2.code) THEN
RETURN -1;
ELSE IF ($1.code>$2.code) THEN
RETURN 1;
ELSE
RETURN 0;
END IF;END IF;END IF;END IF;

RETURN 0;
END;'
LANGUAGE 'plpgsql' VOLATILE;
COMMENT ON FUNCTION ibpc_cmp(ibpc, ibpc) IS 'Compare two keys and return an integer less than zero, zero, or greater than zero, indicating whether the first key is less than, equal to, or greater than the second';

CREATE OPERATOR > (PROCEDURE = is_gt, LEFTARG = ibpc, RIGHTARG = ibpc);
CREATE OPERATOR >= (PROCEDURE = is_ge, LEFTARG = ibpc, RIGHTARG = ibpc);
CREATE OPERATOR = (PROCEDURE = is_equal, LEFTARG = ibpc, RIGHTARG = ibpc);
CREATE OPERATOR <= (PROCEDURE = is_le, LEFTARG = ibpc, RIGHTARG = ibpc);
CREATE OPERATOR < (PROCEDURE = is_lt, LEFTARG = ibpc, RIGHTARG = ibpc);

CREATE OPERATOR CLASS ibpc_ops
DEFAULT FOR TYPE ibpc USING btree AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 ibpc_cmp(ibpc, ibpc)
;

После этого получилось из поля типа ibpc сделать первичный ключ.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023