Re: Support functions for GiST index on citext

Поиск
Список
Период
Сортировка
От BladeOfLight16
Тема Re: Support functions for GiST index on citext
Дата
Msg-id CA+=1U=UFwGgb_3bh6o7ryOcrr-re8iHewnBLz1uOiTWhOpLWiQ@mail.gmail.com
обсуждение исходный текст
Ответ на Support functions for GiST index on citext  (Chris Hanks <christopher.m.hanks@gmail.com>)
Ответы Re: Support functions for GiST index on citext  (Chris Hanks <christopher.m.hanks@gmail.com>)
Список pgsql-general
Have you considered normalizing?

Here's a SQLFiddle example: http://sqlfiddle.com/#!15/61897/3/0. It uses text instead of citext, but I imagine your results should be similar. Also, I think usage of citext is generally recommended against.

The basic idea is to not use an array but use a second table instead. This is well suited to your problem since you need a global unique constraint across all entries; a unique index will be a very efficient way of constraining that. You get your data back into the array form by doing a JOIN and grouping by the first table's primary key.


On Fri, Aug 15, 2014 at 11:46 AM, Chris Hanks <christopher.m.hanks@gmail.com> wrote:
Hi -

I have a table with a citext[] column, and I'm trying to write a
uniqueness constraint for the array values. That is, two rows with
{one,two} and {two,three} would conflict. Since it's citext, also
{one,two} and {TWO, THREE} should conflict too.

My first thought was to make a unique index using GIN, but that
doesn't seem to be an option. Someone in IRC suggested an exclusion
constraint, but it looks like the citext extension doesn't include any
support for GiST operators.

So now I'm trying to write my own GiSt-citext operator class to
accomplish this. So far I have:

CREATE OPERATOR CLASS _citext_ops DEFAULT
  FOR TYPE _citext USING gist AS
  OPERATOR 3 &&(anyarray, anyarray),
  OPERATOR 7 @>(anyarray, anyarray),
  OPERATOR 8 <@(anyarray, anyarray),
  OPERATOR 6 =(anyarray, anyarray),
  FUNCTION 7 citext_eq(citext, citext),
  STORAGE citext;

I know I need more functions, but I'm not sure what they should be, or
if its even possible to do this in raw SQL (I'm hosted on Heroku so I
don't have the freedom to compile my own functions in C, even if I
knew it).

Can anyone guide me on how to finish this, or maybe on a simpler way
to accomplish the same thing?

Thanks!
Chris


--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

В списке pgsql-general по дате отправления:

Предыдущее
От: Adrian Klaver
Дата:
Сообщение: Re: logfile character encoding
Следующее
От: Chris Hanks
Дата:
Сообщение: Re: Support functions for GiST index on citext