Nulls may lead to a surprise with a desc unique index.
SQL> create table a(a varchar2(2 char), b varchar2(2 char) );
Table created.
SQL>
SQL> select table_name,column_name,data_type,data_length from user_tab_cols where table_name = 'A';
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------------ ------------------------------ --------------------------------------
A A VARCHAR2
A B VARCHAR2
SQL>
SQL> create unique index a_idx on a (a,b desc);
Index created.
SQL>
SQL> select table_name,column_name,data_type,data_length from user_tab_cols where table_name = 'A';
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------------ ------------------------------ --------------------------------------
A A VARCHAR2
A B VARCHAR2
A SYS_NC00003$ RAW
SQL>
SQL> select index_type from user_indexes where index_name = 'A_IDX';
INDEX_TYPE
---------------------------
FUNCTION-BASED NORMAL
SQL>
SQL> select * from user_ind_columns where index_name = 'A_IDX';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
COLUMN_NAME
----------------------------------------------------------------------------------------------------
COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESC
--------------- ------------- ----------- ----
A_IDX A
A
1 8 2 ASC
A_IDX A
SYS_NC00003$
2 13 0 DESC
SQL>
SQL> select * from USER_IND_EXPRESSIONS where index_name = 'A_IDX';
INDEX_NAME TABLE_NAME COLUMN_EXPRESSION
------------------------------ ------------------------------ --------------------------------------
A_IDX A "B"
SQL>
SQL> insert into a values(null,null);
1 row created.
SQL>
SQL> insert into a values(null,null);
insert into a values(null,null)
*
ERROR at line 1:
ORA-00001: unique constraint (KIOS.A_IDX) violated
SQL>
SQL> drop index a_idx;
Index dropped.
SQL>
SQL> create unique index a_idx on a (a,b);
Index created.
SQL>
SQL> insert into a values(null,null);
1 row created.
SQL>
SQL> insert into a values(null,null);
1 row created.
No comments:
Post a Comment