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.