sql >> データベース >  >> RDS >> Oracle

Oracle:関数ベースのインデックス選択的一意性

    のようなものが必要になります
    CREATE UNIQUE INDEX fn_unique_idx 
        ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END,
                   CASE WHEN is_deleted='N' THEN name ELSE null END,
                   CASE WHEN is_deleted='N' THEN type ELSE null END);
    

    実行中の制約の例

    SQL> create table table1 (
      2    id number,
      3    name varchar2(10),
      4    type varchar2(10),
      5    is_deleted varchar2(1)
      6  );
    
    Table created.
    
    SQL> CREATE UNIQUE INDEX fn_unique_idx
      2      ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END,
      3                 CASE WHEN is_deleted='N' THEN name ELSE null END,
      4                 CASE WHEN is_deleted='N' THEN type ELSE null END);
    
    Index created.
    
    SQL> insert into table1 values( 1, 'Foo', 'Bar', 'N' );
    
    1 row created.
    
    SQL> insert into table1 values( 1, 'Foo', 'Bar', 'Y' );
    
    1 row created.
    
    SQL> insert into table1 values( 1, 'Foo', 'Bar', 'Y' );
    
    1 row created.
    
    SQL> insert into table1 values( 1, 'Foo', 'Bar', 'N' );
    insert into table1 values( 1, 'Foo', 'Bar', 'N' )
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SCOTT.FN_UNIQUE_IDX) violated
    
    
    SQL> insert into table1 values( 1, 'Foo', 'Zee', 'N' );
    
    1 row created.
    


    1. 実際のMySQLクエリ時間の測定

    2. 列の順序が考慮されていない(設定されている)一意のインデックスを作成する方法

    3. 複数の結果セットを持つストアドプロシージャからデータを取得します

    4. SQLiteサブクエリ