Search code examples
sqloracle-databaseconditional-statementsuniqueunique-constraint

Conditional unique constraint with multiple fields in oracle db


I have this table:

XPTO_TABLE (id, obj_x, date_x, type_x, status_x)

I wanna create a unique constraint that applies to the fields (obj_x, date_x, type_x) only when status_x <> 5.

I have tried to create this one but Oracle says:

line 1: ORA-00907: missing right parenthesis
CREATE UNIQUE INDEX UN_OBJ_DT_TYPE_STATUS
ON XPTO_TABLE(
    (CASE
         WHEN STATUS_X <> 5
         THEN
             (OBJ_X,
              TO_CHAR (DATE_X, 'dd/MM/yyyy'),
              TYPE_X)
         ELSE
             NULL
     END));

What's the correct syntax ?


Solution

  • @jamesfrj: it looks like you are trying to ensure that your table should contain only one record for which status <>5.

    You can try creating a unique functional index by concatenating the columns, as given below

          create table XPTO_TABLE (id number, 
                                obj_x varchar2(20),
                                date_x date,
                                type_x varchar2(20),
                                status_x varchar2(20)                              
                               );
    
          create unique index xpto_table_idx1 on XPTO_TABLE(case when status_x <>'5'  THEN              obj_x||date_x||type_x||STATUS_x ELSE null END);