Re: How to create case insensitive unique constraint

Lists: pgsql-general
From: "Andrus" <eetasoft(at)online(dot)ee>
To: pgsql-general(at)postgresql(dot)org
Subject: How to create case insensitive unique constraint
Date: 2005-09-21 16:15:09
Message-ID: dgs1hn$lco$1@news.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-general

I want to disable dupplicate customer names in a database regardless to
case.

I tried

CREATE TABLE customer ( id SERIAL, name CHARACTER(70));

ALTER TABLE customer
ADD constraint customer_name_unique UNIQUE (UPPER(name));

but this is not allowed in Postgres

Any idea ?

Andrus.


From: Csaba Nagy <nagy(at)ecircle-ag(dot)com>
To: Andrus <eetasoft(at)online(dot)ee>
Cc: Postgres general mailing list <pgsql-general(at)postgresql(dot)org>
Subject: Re: How to create case insensitive unique constraint
Date: 2005-09-21 16:47:11
Message-ID: 1127321230.3026.201.camel@coppola.muc.ecircle.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-general

I guess you can create a unique functional index with upper as the
function. Try to look up the docs for CREATE INDEX.

HTH,
Csaba.

On Wed, 2005-09-21 at 18:15, Andrus wrote:
> I want to disable dupplicate customer names in a database regardless to
> case.
>
> I tried
>
> CREATE TABLE customer ( id SERIAL, name CHARACTER(70));
>
> ALTER TABLE customer
> ADD constraint customer_name_unique UNIQUE (UPPER(name));
>
> but this is not allowed in Postgres
>
> Any idea ?
>
> Andrus.
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly


From: "John D(dot) Burger" <john(at)mitre(dot)org>
To: "Andrus" <eetasoft(at)online(dot)ee>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: How to create case insensitive unique constraint
Date: 2005-09-21 17:38:27
Message-ID: c57a8ecec259afdc4f4caafc5d0e92eb@mitre.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-general

> I want to disable dupplicate customer names in a database regardless to
> case.
>
> I tried
>
> CREATE TABLE customer ( id SERIAL, name CHARACTER(70));
>
> ALTER TABLE customer
> ADD constraint customer_name_unique UNIQUE (UPPER(name));
>
> but this is not allowed in Postgres

As Csaba suggested, a unique functional index does the trick - here's
how I do it in something I'm working on right now:

CREATE UNIQUE INDEX gazPlaceNames_lower_PlaceName2_Index on
gazPlaceNames (lower(placeName));

You could use upper() similarly - lower() is better for Unicode data,
like mine. Now, If I try to add an alternate casing for an existing
name, I get slapped:

> select * from gazPlaceNames where lower(placeName) like lower('New
York');
placenameid | placename | lang | script
-------------+-----------+------+--------
291642 | New York | |
(1 row)

> insert into gazPlaceNames (placename) values ('NeW yOrK');
ERROR: duplicate key violates unique constraint
"gazplacenames_lower_placename2_"

As a bonus, Postgres will use the index for selects involving
lower(placename), like the one above.

- John Burger
MITRE


From: "Andrus" <eetasoft(at)online(dot)ee>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: How to create case insensitive unique constraint
Date: 2005-09-21 18:10:47
Message-ID: dgs7qs$1us6$1@news.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-general

> You could use upper() similarly - lower() is better for Unicode data, like
> mine.

John,

thank you. Excellent.
I have database encoding UNICODE. Why lower() is better than upper()?

Andrus.