oracle

Oracle PKの作成と削除

お勧めの作成方法は以下です

PKの作成(add constraint句を使うケース)
ALTER TABLE TBL26 ADD CONSTRAINT PK_TBL26 PRIMARY KEY (AUTO_ID)
USING INDEX TABLESPACE TBS01
;
PKの削除

PKをDROP INDEXで削除を試みると「 ORA-02429: 一意キーまたは主キーの保持に使用される索引は削除できません 」エラーが発生します。PKの削除はDROP CONSTRAINTにて削除します。

ALTER TABLE TBL26 DROP CONSTRAINT PK_TBL26
;

PKの作成方法は3つあります

No.1 制約名を指定し、自動で同名のインデックスをOracle任せで作ってもらう方法

これは上記記載した方法です。個人的にはこちらが一番おすすめです

-- 制約名とキー項目の指定をして作成
SQL> alter table tbl035 ADD constraint pk_035 primary key  (lno)
  2  ;

Table TBL035が変更されました。

SQL>
-- PK制約を削除する事で自動でインデックスも削除されます。
SQL> alter table tbl035 drop constraint pk_035
  2  ;

Table TBL035が変更されました。

SQL>
No.2 キー項目のみ指定し制約名もインデクスもOracle任せで作ってもらう方法
-- キー項目のみを指定して作成
SQL> alter table sooni.tbl035 add primary key (lno)
  2  ;

Table SOONI.TBL035が変更されました。

SQL>
-- 作成時お手軽な分、削除する際はひと手間かかります
-- 制約名を事前に調べる
-- 制約名もインデックス名もOracleが自動で作成し同じ名称になっています
SQL> select c.CONSTRAINT_NAME,c.INDEX_OWNER,c.INDEX_NAME from dba_constraints c
  2  where c.OWNER = 'SOONI' and c.TABLE_NAME='TBL035' and c.CONSTRAINT_TYPE='P'
  3  ;

   CONSTRAINT_NAME    INDEX_OWNER      INDEX_NAME
__________________ ______________ _______________
SYS_C0012588       SOONI          SYS_C0012588

SQL>

-- 制約名が分かったところで削除できます
SQL> alter table tbl035 drop constraint SYS_C0012578
  2  ;

Table TBL035が変更されました。

SQL>
-- 制約の削除とともにインデックスも削除します。
No.3 事前に作ったインデックスを用いて指定の制約名でPKを作成する方法

こちらの方法をとった場合に限り、制約名とインデクス名が異なります。

-- まずはインデックスを作成する
SQL> create index sooni.key_035 on tbl035(lno)
  2  ;

Index SOONI.KEY_035は作成されました。

-- 続いて制約を作成する(事前に作ったインデックスを指定する)
-- 今回は明示的に「using index sooni.KEY_035」としていますが指定しなくとも
-- primary key で指定した項目を使ったインデックスがあればそれが自動で採用されます
SQL> alter table tbl035 add constraint pk_035 primary key (lno) using index sooni.KEY_035
  2  ;

Table TBL035が変更されました。

SQL>
-- 上記2つの方法と異なり、PK制約を削除してもインデックスは残ります。
-- (別々に作成したのだから当然といえば当然ですね)
SQL> alter table sooni.TBL035 drop constraint pk_035
  2  ;

Table SOONI.TBL035が変更されました。

SQL>
制約名とインデックス名はDBA_CONSTRAINTにて確認できます
select c.OWNER,c.TABLE_NAME,c.CONSTRAINT_NAME,c.INDEX_OWNER,c.INDEX_NAME 
from dba_constraints c 
where c.OWNER = 'SOONI' and c.TABLE_NAME='TBL035' and c.CONSTRAINT_TYPE='P'
;

以下は上記No.3実行後のものです。制約名とインデックス名が異なる事が確認できます

   OWNER    TABLE_NAME    CONSTRAINT_NAME    INDEX_OWNER    INDEX_NAME
________ _____________ __________________ ______________ _____________
SOONI    TBL035        PK_035             SOONI          KEY_035

SQL>

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

プライマリーキー(PRIMARY KEY)とユニークインデックスは何れも重複行を認めないという意味では似ていますが以下の点で異なります。

  • PKは1テーブルに1つしか作成できない。
  • PK項目にはNULL値を設定できない。ユニークキー項目は当然ユニークである必要ありますが、NULLは許容されます。「NULL以外の値でユニーク」であればよいのです。

また上記3つの作成方法をみてよくわかるとおもいますが、プライマリーキーというのは「制約」であってインデックスではない事理解できます。プライマリーキー制約を作成するにあたってインデックスの作成を伴うというのが正確なところだと思います。

DBA_CONS_COLUMNSを参照すればPK構成カラムを確認できます

スポンサーリンク
タイトルとURLをコピーしました