Thanks, Michael. You are correct, Derby, like DB2, finesses this issue
by not allowing nullable columns in unique constraints. I have closed
this bug.
Cheers,
-Rick
Michael J. Segel wrote:
On Wednesday 26 October 2005 19:22, Rick Hillegas wrote:
Sorry to top post...
Sigh.
Seems that some are quick to pull the trigger and call everything they see a
bug!
This is not a bug. ;-)
Its a design issue.
I'm sure that this distinction is going to be lost on a couple of people, and
it goes back to an earlier isssue about how each database handles
constraints. You can always e-mail me directly and take this offline.
Whomever designed how Derby handles constraints, Derby does not allow for
NULLs in columns that have been identified in a constraint. Its actually in
the reference manual. (The exercise of finding it is left to the
student.... ;-)
Now if you want a simple work around, just create a unique index on the table.
Here's the code I just ran and it works:
CREATE TABLE foo
( id int NOT NULL,
name char(25)
);
CREATE UNIQUE INDEX fidx ON foo (id, name);
Then I added the following rows:
INSERT INTO foo VALUES (1,'AAA');
INSERT INTO foo VALUES (2,'BBB');
INSERT INTO foo VALUES (3,'CCC');
INSERT INTO foo VALUES (4,'DDD');
INSERT INTO foo VALUES (5,'EEE');
INSERT INTO foo VALUES (1,'FFF');
INSERT INTO foo VALUES (6, NULL);
INSERT INTO foo VALUES (1,'AAA'); -- THIS ROW FAILS!
SELECT * FROM foo;
NOTE THE FOLLOWING:
Indexes are not the same as Constraints, however they can be used to achieve
the same goal.
Please remember, because you may not get the results that you expect, that
doesn't mean that you actually have a bug.
If someone wants to consider how to redesign how contraints work, you have a
couple of other considerations. For example, which takes precedence? SQL
statements that manage the container, or SQL statements that manage the data?
(And that's a loaded question.... ;-)
HTH
-Mikey
PS. Again, what do I know? Rumor has it my older siblings dropped me on my
head when I was an infant. ;-)
Hi Dan,
I believe that the Sybase behavior is correct. I have logged bug 653 to
track this issue.
Regards,
-Rick
Dan Meany wrote:
I noticed that in Derby a unique constraint on two
columns A and B, with B nullable, will prevent
inserting two identical records that contain NULL in
B.
This is different from some other databases such as
Sybase that do allow it (I assume where the null
records are not in stored as part of the unique
index).
I noticed this while transfering data from Sybase to
Derby using Apache dbutils and getting rejected
duplicate records.