Re: 8.1 Unique Index Issue/Bug???

From: Andy Shellam <andy(at)andycc(dot)net>
To: Chris Hoover <revoohc(at)gmail(dot)com>, pgsql-admin(at)postgresql(dot)org
Subject: Re: 8.1 Unique Index Issue/Bug???
Date: 2006-07-13 15:50:55
Message-ID: 44B66BDF.9000608@andycc.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin

PostgreSQL does not consider a NULL value to be an equal value,
therefore it cannot be a duplicate.

If you must have a blank value in a column and need it to be unique,
you'd need to do something like an empty string, or a string/figure your
application will know is a null value that makes sense.

It's also the same on multi-column indexes - if one column is NULL-able,
the index won't be enforced against the null values.

From http://www.postgresql.org/docs/8.1/static/indexes-unique.html:

"When an index is declared unique, multiple table rows with equal
indexed values will not be allowed. Null values are not considered
equal. A multicolumn unique index will only reject cases where all of
the indexed columns are equal in two rows."

Andy.

Chris Hoover wrote:
> I am having what appears to be a bug with unique indexes on 8.1.3.
>
> I have created a new table.
>
> create table payer_835 (
> payer_id int8 not null default
> nextval('payer_835_payer_id_seq'::regclass) primary key,
> payer_name varchar(50) not null,
> payer_trn03 varchar(10) not null,
> payer_trn04 varchar(30),
> sku_id int8 references skucode(sku_id) on delete
> cascade on update cascade,
> payer_billable boolean not null default true,
> create_timestamp timestamp not null default now(),
> last_mod_timestamp timestamp,
> expire_timestamp timestamp
> );
>
> On this table, I have created a unique index on payer_trn03,
> payer_trn04, and expire_timestamp. However, since the
> expire_timestamp is normally null, the unique index does not appear to
> be working. I have been able to enter two identical rows into this
> table.
>
> Why is PostgreSQL not enforcing this index? This appears to be a
> pretty major a bug? It would seem that you could have a unique index
> across columns that might have a null in them.
>
> Here is the data from the table:
>
> COPY payer_835 (payer_id, payer_name, payer_trn03, payer_trn04,
> sku_id, payer_billable, create_timestamp, last_mod_timestamp,
> expire_timestamp) FROM stdin;
> 1 CAHABA GBA-AL PART B 1630103830 \N 1
> t 2006-07-13 09:57: 52.834631 \N \N
> 2 FEP 123456789 00402 1 t 2006-07-10
> 10:56:23 \N \N
> 3 NC Medicaid 123123123 \N 1 t
> 2006-07-10 10:56:41 \N \N
> 4 CAHABA GBA-AL PART B 1630103830 \N 1
> t 2006-07-11 16:13:43.808181 2006-07-12 10:09:46.066204 \N
> \.
>
>
> Notice records 1 and 4 have identical data (as far as my unique index
> is concerned), and the index it not complaining.
>
> thanks,
>
> Chris
> RHAS 4.0
> PG 8.1.3 (from rpms)
> !DSPAM:14,44b66a2a34531616211146!

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Peter Eisentraut 2006-07-13 15:55:26 Re: 8.1 Unique Index Issue/Bug???
Previous Message Chris Browne 2006-07-13 15:34:43 Re: Where are the temporary work / sort files please