主キーと一意インデックスの違い
-- 違い
主キーは制約であり、一意インデックスはインデックスです。この 2 つは本質的に異なります。
主キーの作成後は、一意のインデックスが含まれている必要があります。一意のインデックスは必ずしも主キーである必要はありません。
一意のインデックス列では null 値が許可されますが、主キー列では null 値が許可されません。
主キー列が作成されると、デフォルトで null 値 + 一意のインデックスになります。
主キーは他のテーブルから外部キーとして参照できますが、一意のインデックスは参照できません。
テーブルは主キーを 1 つしか作成できませんが、複数の一意のインデックスを作成できます。
主キーは、自動インクリメント列や 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 に 2 つのインデックス名が表示されます
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_CONSTRAINTS では、主キー制約名のみが表示されます
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');
-- 一意のインデックスに非 null 制約を追加します
ALTER TABLE test MODIFY UniqueKey NOT NULL;
-- USER_CONSTRAINTS には主キー制約名と非 null 制約名のみが表示されます
SELECT table_name,constraint_name,constraint_type
FROM USER_CONSTRAINTS WHERE TABLE_NAME='TEST'
- - USER_CONS_COLUMNS のみ 主キー制約フィールド名と非 null 制約フィールド名を監視できます
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')
以上が主キーと一意のインデックスの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。