| 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: | Whole Thread | Raw Message | 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! 
| 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 |