31章 ALTER文
では、本日は制約の定義方法について学んでいきます。
今までは表を作成するときに制約を定義する方法を学んできましたが、
表の作成後に制約だけを定義することが可能です。
制約を定義するときはALTER TABLE文を使用します。
28章のテーブル変更でも紹介しましたね。
  [構文] 制約の追加
 ALTER TABLE 表名 ADD
 [CONSTRAINT 制約名] 制約タイプ (列名);
  [構文] 制約の削除
 ALTER TABLE 表名 DROP CONSTRAINT 制約名;
  [構文] 制約名の変更
 ALTER TABLE 表名 RENAME
 CONSTRAINT 制約名 TO 新制約名;
ちなみに制約を変更する構文はありませんので、制約を変更したい場合は、
削除してから、再度定義する必要があります。
では実行例を見ていきましょう。
  SQL> select * from test;
          ID NAME
  ---------- ------------------------------
          10 AAAA
          20 BBBB
  SQL> alter table test add constraint test_id_pk primary key(id);
  Table altered.
  SQL> insert into test values (10,'CCCC');
  insert into test values (10,'CCCC')
  *
  ERROR at line 1:
  ORA-00001: unique constraint (ORA.TEST_ID_PK) violated
上記例はID列に対し主キー制約を定義したので、INSERT文でID列に10を挿入しようとし
エラーとなっています。10は既に挿入されている値であるため、
今回定義した主キーでエラーとなっています。
  SQL> alter table test drop constraint test_id_pk;
  Table altered.
  SQL> insert into test values (10,'CCCC');
  1 row created.
  SQL> select * from test;
          ID NAME
  ---------- ------------------------------
          10 AAAA
          20 BBBB
          10 CCCC
  SQL> commit;
  Commit complete.
  
上記は先ほど作成した主キー制約を削除しているので、
INSERT文が成功しています。
最後にすでに重複した列に対し、主キー制約や一意キー制約を定義したらどうなるか
確認してみます。
  SQL> alter table test add constraint test_id_pk primary key(id);
  alter table test add constraint test_id_pk primary key(id)
                                  *
  ERROR at line 1:
  ORA-02437: cannot validate (ORA.TEST_ID_PK) - primary key violated
  
上記のようにすでに重複した値が挿入されている場合はエラーとなります。
以上が制約の追加、削除についてのご紹介となります。