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