For those wondering how unique indices with multiple null values may
be implemented, it can be done pretty simple: The columns with null
values are not part of the index. This will if course affect the
execution plan.

Example:

CREATE TABLE t (i INTEGER, a INTEGER NOT NULL, b INTEGER);
CREATE UNIQUE INDEX idx1 ON t(i);
CREATE UNIQUE INDEX idx2 ON t(a, b);

Here are some more examples, assuming that nulls are not stored in indexes:

CREATE TABLE t2 (i INTEGER, j INTEGER NOT NULL);
CREATE INDEX idx3 on t2(i);
CREATE UNIQUE INDEX idx4 on t2(j);

SELECT i FROM t2;  -- use index idx3 (covers query)
SELECT j FROM t2;  -- Do a table scan


There is of course are other ways of implementing unique indices with
multiple null values.
--
Bernt Marius Johnsen, Database Technology Group,

Yes. The comparison operations for datatypes are defined in the interface:

org.apache.derby.iapi.types.DataValueDescriptor

This interface defines two comparison methods:


        /**
         * Compare this Orderable with a given Orderable for the purpose of
         * index positioning.  This method treats nulls as ordered values -
         * that is, it treats SQL null as equal to null and less than all
         * other values.
         *
         * @param other         The Orderable to compare this one to.
         *
         * @return  <0 - this Orderable is less than other.
         *                       0 - this Orderable equals other.
         *                      >0 - this Orderable is greater than other.
     *
     *                  The code should not explicitly look for -1, or 1.
         *
         * @exception StandardException         Thrown on error
         */
        int compare(DataValueDescriptor other) throws StandardException;

        /**
         * Compare this Orderable with a given Orderable for the purpose of
         * qualification and sorting.  The caller gets to determine how nulls
         * should be treated - they can either be ordered values or unknown
         * values.
         *
         * @param op    Orderable.ORDER_OP_EQUALS means do an = comparison.
* Orderable.ORDER_OP_LESSTHAN means compare this < other. * Orderable.ORDER_OP_LESSOREQUALS means compare this <= other.
         * @param other The DataValueDescriptor to compare this one to.
         * @param orderedNulls  True means to treat nulls as ordered values,
* that is, treat SQL null as equal to null, and less
         *                                              than all other values.
* False means to treat nulls as unknown values, * that is, the result of any comparison with a null * is the UNKNOWN truth value. * @param unknownRV The return value to use if the result of the * comparison is the UNKNOWN truth value. In other * words, if orderedNulls is false, and a null is * involved in the comparison, return unknownRV. * This parameter is not used orderedNulls is true.
         *
         * @return      true if the comparison is true (duh!)
         *
         * @exception StandardException         Thrown on error
         */
        boolean compare(
    int         op,
    DataValueDescriptor   other,
    boolean     orderedNulls,
    boolean     unknownRV)
                                throws StandardException;

I don't know which compare method the store uses to determine uniqueness of a data value for a unique index. I suspect it either uses the first, or it uses the second with orderedNulls equal to TRUE. In any case, the interface already supports a technique to allow multiple nulls in a unique index. There may be some reason the store can't use this technique, though.


                       -        Jeff Lichtman
                                [EMAIL PROTECTED]
                                Check out Swazoo Koolak's Web Jukebox at
http://swazoo.com/

Reply via email to