Thread: Constraint UNIQUE on a column not case sensitive

Constraint UNIQUE on a column not case sensitive

From
Daniel CAUNE
Date:
Hi,

I would like to find an efficient solution for adding/implementing a constraint UNIQUE on a VARCHAR column not case
sensitive:

ALTER TABLE MyTableADD CONSTRAINT UNQ_MyTable_MyColumn     UNIQUE (lower(MyColumn));       -- invalid syntax

The idea is to have an index on that column, in a not case sensitive form, i.e. lower(MyColumn).

SELECT * FROM MyTable WHERE lower(MyColumn) = lower('...');

I don't know how to add such a constraint on MyTable except by defining a trigger on INSERT clause and checking whether
lower(:NEW.MyColumn)has been already inserted in MyTable.
 

Is there better and more efficient way to do that?

Regards,


--
Daniel



Re: Constraint UNIQUE on a column not case sensitive

From
Michael Glaesemann
Date:
On Jul 1, 2006, at 22:47 , Daniel CAUNE wrote:

> The idea is to have an index on that column, in a not case  
> sensitive form, i.e. lower(MyColumn).

I think you're really close. Try

CREATE UNIQUE INDEX ci_mycolumn_idx ON mytable(lower(mycolumn));

Does that do what you're looking for?

Michael Glaesemann
grzm seespotcode net





Re: Constraint UNIQUE on a column not case sensitive

From
Jorge Godoy
Date:
Daniel CAUNE <d.caune@free.fr> writes:

> Hi,
>
> I would like to find an efficient solution for adding/implementing a
> constraint UNIQUE on a VARCHAR column not case sensitive:
>
> ALTER TABLE MyTable
>  ADD CONSTRAINT UNQ_MyTable_MyColumn
>       UNIQUE (lower(MyColumn));       -- invalid syntax
>
> The idea is to have an index on that column, in a not case sensitive form,
> i.e. lower(MyColumn).

What's the problem with CREATE INDEX then? 

CREATE INDEX idx_something ON mytable (lower(mycolumn));

-- 
Jorge Godoy      <jgodoy@gmail.com>


Re: Constraint UNIQUE on a column not case sensitive

From
Daniel CAUNE
Date:
> -----Message d'origine-----
> De : Michael Glaesemann [mailto:grzm@seespotcode.net]
> Envoyé : samedi 1 juillet 2006 10:01
> À : Daniel CAUNE
> Cc : pgsql-sql@postgresql.org
> Objet : Re: [SQL] Constraint UNIQUE on a column not case sensitive
>
>
> On Jul 1, 2006, at 22:47 , Daniel CAUNE wrote:
>
> > The idea is to have an index on that column, in a not case
> > sensitive form, i.e. lower(MyColumn).
>
> I think you're really close. Try
>
> CREATE UNIQUE INDEX ci_mycolumn_idx ON mytable(lower(mycolumn));
>
> Does that do what you're looking for?
>
> Michael Glaesemann
> grzm seespotcode net
>
>

Yes, indeed!  I'm stupid!  I was searching a constraint form while the creation of an UNIQUE index makes the job too!

The following form is not valid:

ALTER TABLE MyTable ADD CONSTRAINT UNQ_MyTable_MyColumn     UNIQUE (lower(MyColumn));

But your form makes the expected job:

CREATE UNIQUE INDEX IDX_MyTable_MyColumn ON MyTable (lower(MyColumn));

Thanks,

--
Daniel CAUNE