プライマリ・キー・インデックスとユニーク・インデックスの違い


--違い
プライマリ・キーは制約であり、一意のインデックスはインデックスであり、本質的には異なります.プライマリ・キーが作成されると、必ず一意性インデックスが含まれます.一意性インデックスは必ずしもプライマリ・キーではありません.ユニークインデックス列にはNull値が許可されますが、プライマリ・キー列にはNull値は許可されません.プライマリ・キー列は、作成時にデフォルトで空の値+一意のインデックスになっています.プライマリ・キーは、他のテーブルで外部キーとして参照できますが、一意のインデックスは使用できません.1つのテーブルに1つのプライマリ・キーしか作成できませんが、複数の一意のインデックスを作成できます.プライマリ・キーは、自動増分列、ID番号など、変更しにくい一意のIDに適しています.RBOモードでは、プライマリ・キーの実行計画の優先度がユニーク・インデックスよりも高くなります.両者はクエリの速度を向上させることができます.
 
--プライマリ・キーとユニーク・インデックスのみを含むテーブルを作成します.
CREATE TABLE test

(PrimaryKey VARCHAR2(20),

  UniqueKey  VARCHAR2(20)

);

--プライマリ・キーとユニーク・インデックスが別々に作成され、構文が異なります.
ALTER TABLE test ADD CONSTRAINT test_PrimaryKey PRIMARY KEY (PrimaryKey);

CREATE UNIQUE INDEX test_UniqueKey ON test (UniqueKey);

--   USER_INDEXES            

SELECT table_name,table_type,index_name,index_type,uniqueness

  FROM USER_INDEXES

  WHERE TABLE_NAME='TEST';

--USER_IND_COLUMNSには2つのインデックスフィールド名が表示されます
SELECT table_name,index_name,column_name,column_position

  FROM USER_IND_COLUMNS

  WHERE TABLE_NAME='TEST';


--USER_CONTRAINTSではプライマリ・キー制約名のみが表示されます
SELECT table_name,constraint_name,constraint_type

  FROM USER_CONSTRAINTS

  WHERE TABLE_NAME='TEST';


--USER_CONS_COLUMNSでは、プライマリ・キー制約フィールド名のみが表示されます.
SELECT table_name,constraint_name,column_name,position

  FROM USER_CONS_COLUMNS

  WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME

  FROM USER_CONSTRAINTS

  WHERE TABLE_NAME='TEST');


--一意のインデックスに対して空でない制約を追加
ALTER TABLE test MODIFY UniqueKey NOT NULL;


--USER_CONTRAINTSでは、プライマリ・キー制約名と空でない制約名のみが表示されます.
SELECT table_name,constraint_name,constraint_type

  FROM USER_CONSTRAINTS

  WHERE TABLE_NAME='TEST'

--USER_CONS_COLUMNSでは、プライマリ・キー制約フィールド名と空でない制約フィールド名のみが表示されます.
SELECT table_name,constraint_name,column_name,position

  FROM USER_CONS_COLUMNS

  WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME

  FROM USER_CONSTRAINTS

  WHERE TABLE_NAME='TEST')