Re: 8.1 Unique Index Issue/Bug???
От | Andy Shellam |
---|---|
Тема | Re: 8.1 Unique Index Issue/Bug??? |
Дата | |
Msg-id | 44B66BDF.9000608@andycc.net обсуждение исходный текст |
Ответ на | 8.1 Unique Index Issue/Bug??? ("Chris Hoover" <revoohc@gmail.com>) |
Список | 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!
В списке pgsql-admin по дате отправления: