ORACLE制約の基礎知識の紹介



1、制約の分類.
制約は5つのクラスに分けられます:1.not null,2.primary key,3.check,4.unique,5.foreign key.
1.1 not null制約
デフォルトでは、すべてのカラムの値にnull値を含めることができます.カラムにnot null制約を定義すると、カラムの上に値が必要になります.not nullコンストレイントは、uniqueコンストレイントとともに使用するなど、他のコンストレイントと組み合わせて使用することも多く、新しく挿入されたカラムのデータが既存のデータと競合しないことを保証します.かなりのカラムにインデックスを作成する必要がある場合は、インデックスがnullレコードを格納しないため、関連するカラムにnot null制約を追加することをお勧めします.
1.2 primary key制約
プライマリ・キー・コンストレイントは、ロー・レコードの一意性、重複性を保証するためにnot nullコンストレイントとuniqueコンストレイントの組み合わせです.各テーブルにはプライマリ・キー制約が1つしかありません.テーブル設計の場合、通常、各テーブルにプライマリ・キー制約があります.プライマリ・キーを作成すると、適切な制約名のインデックスが独自に作成されます.プライマリ・キー制約の列を選択するときは、次の手順を参照してください.
           1.sequenceの列をプライマリ・キーとして選択します.
           2.カラムの値が一意でnull値のないカラムを選択します.
           3.プライマリ・キーの変更は一般的には行われず、ローの一意性を識別するためにのみ使用され、他の目的では使用されません.
           4.プライマリ・キーの列は、できるだけ値が短い値またはnumberの値を選択します.
1.3 unique制約
Uniqueコンストレイントは、値のレコードに同じ値が表示されないことを保証しますが、noll値は権限を受けず、uniqueコンストレイントを作成すると、コンストレイント名のインデックスが自分で作成されます.
1.4 check制約
検査制約は、値が挿入時に指定する条件を満たすかどうかを検査するために用いる、例えば、値の要求が10より大きく100より小さい.
1.5 foreign key制約
2つのテーブルの場合、Aテーブルのカラムの値がBテーブルのカラムの値でなければならない場合、外部キー制約を定義できます.親テーブルに関連する値には、プライマリ・キーまたは一意性制約があります.しかし、多くの会社は外部キーを使用してはいけないと要求し、開発者に自分でプログラムで判断させる.
 
2,制約の定義
コンストレイントは、テーブルの作成時に指定するか、テーブルの作成が完了した後にalterコマンドで作成できます.次に、各コンストレイントの作成構文を示します.
  

  
  
  
  
  1.    2.1 not null  
  2.  
  3.       create table test_cons (id number constraint cons_test_cons_id_nonull not null); 
  4.  
  5.       create table test_cons_1(id number not null); 
  6.  
  7.       alter table test_cons_2 modify id not null
  8.  
  9.       2.2 primary key 
  10.  
  11. create table test_cons_1 (id number primary key); 
  12.  
  13. create table test_cons_2 (id number constraint cons_2 primary key); 
  14.  
  15. create table test_cons_3 (id number,constraint cons_3 primary key(id)); 
  16.  
  17. create table test_cons_4 (id number); 
  18.  
  19. alter table test_cons_4 add constraint cons_4 primary key(id); 
  20.  
  21.     2.3 unique 
  22.  
  23. create table test_cons_1 (id number unique); 
  24.  
  25. create table test_cons_2 (id number constraint cons_2 unique); 
  26.  
  27. create table test_cons_3 (id number,constraint cons_3 unique(id)); 
  28.  
  29. create table test_cons_4 (id number); 
  30.  
  31. alter table test_cons_4 add constraint cons_4 unique(id); 
  32.  
  33.  2.4 check 
  34.  
  35. create table test_cons_1 (id number check (id > 10 and id <100)); 
  36.  
  37. create table test_cons_2 (id number constraint cons_2 check (id > 10 and id <100)); 
  38.  
  39. create table test_cons_3 (id number,constraint cons_3 check (id > 10 and id <100)); 
  40.  
  41. create table test_cons_4 (id number); 
  42.  
  43. alter table test_cons_4 add constraint cons_4 check (id > 10 and id <100); 
  44.  
  45. 2.5   
  46.  
  47. create table test_cons_1 (id number,constraint cons_1 foreign key (id) references test_cons(id)); 
  48.  
  49. alter table test_cons_4 add constraint cons_4 foreign key (id) references test_cons(id); 

 
3、制約の保守
 

  
  
  
  
  1. 3.1   
  2.  
  3. alter table test_cons rename constraint cons_id to cons_1_id; 
  4.  
  5. 3.2   
  6.  
  7. alter table test_cons disable constraint cons_1_id; 
  8.  
  9. alter table test_cons disable constraint cons_1_id keep index
  10.  
  11. alter table test_cons disable primary key cascade
  12.  
  13. alter table test_cons enable constraint cons_1_id; 
  14.  
  15. alter table test_cons enable novalidate constraint cons_1_id; 
  16.  
  17. alter table test_cons enable  validate constraint cons_1_id; 
  18.  
  19. 3.3    
  20.  
  21. alter table test_cons modify constraint cons_1_id novalidate; 
  22.  
  23. alter table test_cons modify constraint cons_1_id validate; 
  24.  
  25. alter table test_cons drop constraint cons_1_id keep index
  26.  
  27. alter table test_cons drop constraint cons_1_id; 
  28.  
  29.   

 
4,制約のException
 
If exceptions exist when a constraint is validated, an error is returned and the integrity constraint remains novalidated. When a statement is not successfully executed because integrity constraint exceptions exist, the statement is rolled back. If exceptions exist, you cannot validate the constraint until all exceptions to the constraint are either updated or deleted.
You must create an appropriate exceptions report table to accept information from the EXCEPTIONS option of the ENABLE clause before enabling the constraint. You can create an exception table by executing the UTLEXCPT.SQL script or the UTLEXPT1.SQL script.
Both of these scripts create a table named EXCEPTIONS. You can create additional exceptions tables with different names by modifying and resubmitting the script.
The following statement attempts to validate the PRIMARY KEY of the dept table, and if exceptions exist, information is inserted into a table named EXCEPTIONS:
ALTER TABLE dept ENABLE PRIMARY KEY EXCEPTIONS INTO EXCEPTIONS;
SELECT * FROM EXCEPTIONS;
The following exceptions are shown:
fROWID               OWNER      TABLE_NAME      CONSTRAINT ------------------  ---------  --------------  ----------- AAAAZ9AABAAABvqAAB  SCOTT      DEPT            SYS_C00610 AAAAZ9AABAAABvqAAG  SCOTT      DEPT            SYS_C00610
SELECT deptno, dname, loc FROM dept, EXCEPTIONS     WHERE EXCEPTIONS.constraint = 'SYS_C00610'     AND dept.rowid = EXCEPTIONS.row_id;
 
5,拘束されたDefer
When the database checks a constraint, it signals an error if the constraint is not satisfied. You can defer checking the validity of constraints until the end of a transaction.
When you issue the SET CONSTRAINTS statement, the SET CONSTRAINTS mode lasts for the duration of the transaction, or until another SET CONSTRAINTS statement resets the mode.
 
Set All Constraints Deferred
Within the application being used to manipulate the data, you must set all constraints deferred before you actually begin processing any data. Use the following DML statement to set all deferrable constraints deferred:
SET CONSTRAINTS ALL DEFERRED;
Check the Commit (Optional)
You can check for constraint violations before committing by issuing the SET CONSTRAINTS ALL IMMEDIATE statement just before issuing the COMMIT. If there are any problems with a constraint, this statement fails and the constraint causing the error is identified. If you commit while constraints are violated, the transaction is rolled back and you receive an error message