Alban Hertroys wrote:
Vivek Khera wrote:
http://dev.mysql.com/doc/refman/5.1/en/bdb-restrictions.html
I especially like the third restriction. How on earth do people live
with this software?
That's the part where they allow only one NULL value in a unique index,
right? Opinions seem to differ on this matter...
Is it possible to guarantee that an index is unique at all if it
contains NULL values?
No.
> If I have an index containing [1,2,3,NULL,4,5],
can I say that NULL (it being an "unknown" value) does not equal one of
the other values? Or for that matter, if I'd have multiple NULL values,
can I say they aren't equal? I think not.
Exactly so.
The docs say
(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."
But according to:
http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/21064
"The definition of unique constraints in the SQL standards specifies
that the column definition shall not allow null values.", although that
doesn't literally mean NULL values in unique indexes are not allowed...
It's a tricky question. The only really clean solution is to say that a
UNIQUE constraint requires NOT NULL on all its columns. This is what
happens when you define a primary key of course.
I suppose you *could* say that with a unique constraint over (a,b,c)
then if (1,2,null) is already in the table (1,2,<anything>) is then
forbidden since you can't guarantee it won't conflict. In effect saying
"can I prove this is different from existing values", which of course is
"no" if you're comparing against nulls.
If you're only allowing one null value, you're saying NULL=NULL which of
course is not true. I can see *why* dbms builders choose to do that, but
I don't think it's right.
--
Richard Huxton
Archonet Ltd