Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

제약 조건 정의

제약 조건으로 NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY를 정의할 수 있다. 또한 제약 조건은 아니지만 INDEX 또는 KEY를 사용하여 인덱스를 생성할 수도 있다.

<column_constraint> ::=

NOT NULL | UNIQUE | PRIMARY KEY | FOREIGN KEY <referential definition>

 

<table_constraint> ::=

[ CONSTRAINT [ <constraint_name> ] ] UNIQUE [ KEY | INDEX ]( column_name_comma_list ) |

[ { KEY | INDEX } [ <constraint_name> ]( column_name_comma_list ) |

[ PRIMARY KEY ( column_name_comma_list )] |

[ <referential_constraint> ]

 

<referential_constraint> ::=

FOREIGN KEY ( column_name_comma_list ) <referential definition>

 

<referential definition> ::=

REFERENCES [ referenced_table_name ] ( column_name_comma_list )

[ <referential_triggered_action> ... ]

 

<referential_triggered_action> ::=

{ ON UPDATE <referential_action> } |

{ ON DELETE <referential_action> } |

{ ON CACHE OBJECT cache_object_column_name }

 

<referential_action> ::=

CASCADE | RESTRICT | NO ACTION  | SET NULL

NOT NULL 제약
설명

NOT NULL 제약 조건이 정의된 컬럼은 반드시 NULL이 아닌 값을 가져야 한다. 모든 컬럼에 대해 NOT NULL 제약 조건을 정의할 수 있다. INSERT, UPDATE 구문을 통해 NOT NULL 속성 컬럼에 NULL 값을 입력하거나 갱신하면 에러가 발생한다.

예제

CREATE TABLE const_tbl1(id INT NOT NULL, INDEX i_index(id ASC), phone VARCHAR);

 

CREATE TABLE const_tbl2(id INT NOT NULL PRIMARY KEY, phone VARCHAR);

INSERT INTO const_tbl2 (NULL,'000-0000');

 

In line 2, column 25,

 

ERROR: syntax error, unexpected Null

UNIQUE 제약
설명

UNIQUE 제약 조건은 정의된 컬럼이 고유한 값을 갖도록 하는 제약 조건이다. 기존 레코드와 동일한 컬럼 값을 갖는 레코드가 추가되면 에러가 발생한다.

UNIQUE 제약 조건은 단일 컬럼뿐만 아니라 하나 이상의 다중 컬럼에 대해서도 정의가 가능하다. UNIQUE 제약 조건이 다중 컬럼에 대해 정의되면 각 컬럼 값에 대해 고유성이 보장되는 것이 아니라, 다중 컬럼 값의 조합에 대해 고유성이 보장된다.

예제

UNIQUE 제약 조건이 다중 컬럼에 대해 정의되면 컬럼 전체 값의 조합에 대해 고유성이 보장된다. 아래의 예와 같이 두 번째 입력 구문은 a 컬럼의 값은 같지만 b 컬럼의 값이 고유하므로 성공한다. 세 번째 입력 구문은 a, b 전체에 대해 첫 번째 값과 동일하므로 오류가 발생한다.

--UNIQUE constraint is defined on a single column only

CREATE TABLE const_tbl5(id INT UNIQUE, phone VARCHAR);

INSERT INTO const_tbl5(id) VALUES (NULL), (NULL);

INSERT INTO const_tbl5 VALUES (1, '000-0000');

SELECT * FROM const_tbl5;

 

           id  phone

===================================

         NULL  NULL

         NULL  NULL

            1  '000-0000'

 

INSERT INTO const_tbl5 VALUES (1, '111-1111');

 

ERROR: Operation would have caused one or more unique constraint violations.

 

 

--UNIQUE constraint is defined on several columns

CREATE TABLE const_tbl6(id INT, phone VARCHAR, CONSTRAINT UNIQUE(id,phone));

INSERT INTO const_tbl6 VALUES (1,NULL), (2,NULL), (1,'000-0000'), (1,'111-1111');

SELECT * FROM const_tbl6;

 

           id  phone

===================================

            1  NULL

            2  NULL

            1  '000-0000'

            1  '111-1111'

PRIMARY KEY 제약
설명

테이블에서 키(key)란 각 행을 고유하게 식별할 수 있는 하나 이상의 컬럼들의 집합을 말한다. 후보키(candidate key)는 테이블 내의 각 행을 고유하게 식별하는 컬럼들의 집합을 의미하며, 사용자는 이러한 후보 키 중 하나를 기본키(primary key)로 정의할 수 있다. 즉, 기본키로 정의된 컬럼 값은 각 행에서 고유하게 식별된다.

기본키를 정의하여 생성되는 인덱스는 기본적으로 오름차순으로 생성되며, 컬럼 뒤에 ASC 또는 DESC 키워드를 명시하여 키의 순서를 지정할 수 있다.

구문

CREATE TABLE pk_tbl (a INT, b INT, PRIMARY KEY (a, b DESC));

예제

CREATE TABLE const_tbl7(

id INT NOT NULL,

phone VARCHAR,

CONSTRAINT pk_id PRIMARY KEY(id));

 

--CONSTRAINT keyword

CREATE TABLE const_tbl8(

id INT NOT NULL PRIMARY KEY,

phone VARCHAR);

 

--primary key is defined on multiple columns

CREATE TABLE const_tbl8 (

host_year    INT NOT NULL,

event_code   INT NOT NULL,

athlete_code INT NOT NULL,

medal        CHAR(1)  NOT NULL,

score        VARCHAR(20),

unit         VARCHAR(5),

PRIMARY KEY(host_year, event_code, athlete_code, medal)

);

FOREIGN KEY 제약
설명

외래키(foreign key)란 참조 관계에 있는 다른 테이블의 기본키를 참조하는 컬럼 또는 컬럼들의 집합을 말한다. 외래키와 참조되는 기본키는 동일한 데이터 타입을 가져야 한다. 외래키가 기본키를 참조함에 따라 연관되는 두 테이블 사이에는 일관성이 유지되는데, 이를 참조 무결성(referential integrity)이라 한다.

구문

[ CONSTRAINT < constraint_name > ]

FOREIGN KEY [ <foreign_key_name> ] ( column_name_comma_list )

REFERENCES [ referenced_table_name ] ( column_name_comma_list )

[ <referential_triggered_action> ]

 

<referential_triggered_action> :

ON UPDATE <referential_action>

[ ON DELETE <referential_action> [ ON CACHE OBJECT cache_object_column_name ]]

 

<referential_action> :

CASCADE | RESTRICT | NO ACTION | SET NULL

  • constraint_name : 제약 조건의 이름을 지정한다.
  • foreign_key_name : FOREIGN KEY 제약 조건의 이름을 지정한다. 생략할 수 있으며, 이 값을 지정하면 constraint_name을 무시하고 이 이름을 사용한다.
  • column_name : FOREIGN KEY 키워드 뒤에 외래키로 정의하고자 하는 컬럼 이름을 명시한다. 정의되는 외래키의 개수(식별된 속성의 개수)는 제한이 없으나 기본키의 개수와 동일한 개수만큼 정의되어야 한다.
  • referenced_table_name : 참조되는 테이블의 이름을 지정한다.
  • column_name : REFERENCES 키워드 뒤에 참조되는 기본키 컬럼 이름을 지정한다.
  • referential_triggered_action : 참조 무결성이 유지되도록 특정 연산에 따라 대응하는 트리거 동작을 정의하는 것이며, ON UPDATE, ON DELETE, ON CACHE OBJECT가 올 수 있다. 각각의 동작은 중복하여 정의 가능하며, 정의 순서는 무관하다.
    • ON UPDATE : 외래키가 참조하는 기본키 값을 갱신하려 할 때 수행할 작업을 정의한다. 사용자는 NO ACTION, RESTRICTSET NULL 중 하나의 옵션을 지정할 수 있으며, 기본은 RESTRICT이다.
    • ON DELETE : 외래키가 참조하는 기본키 값을 삭제하려 할 때 수행할 작업을 정의한다. 사용자는 NO ACTION, RESTRICT, CASCADESET NULL 중 하나의 옵션을 지정할 수 있으며, 기본은 RESTRICT이다.
    • ON CACHE OBJECT : 객체 지향 모델링에서는 직접 객체 참조(object reference)를 이용한 객체 탐색이 가능한데, 이것을 참조 무결성 외래키와 연계하여 지원하는 것이 ON CACHE OBJECT 옵션이다. ON CACHE OBJECT 옵션은 외래키 설정에 OID 참조 관계를 부가하고, 설정된 OID는 기본키 테이블에 대한 외래키의 캐시(CACHE) 포인트 개념으로 사용된다. 이렇게 설정된 OID는 시스템 내부적으로만 관리되고, 사용자에 의해 변경될 수 없다.
    • ON CACHE OBJECT를 정의하기 위해서는 기본키를 가진 테이블을 도메인으로하는 컬럼이 이미 정의되어 있어야 하며, cache_object_column_name에 명시되어야 한다. ON CACHE OBJECT로 정의된 속성은 기존 객체 타입의 OID와 동일하게 OID를 사용할 수 있다.
  • referential_ action : 기본키 값이 삭제 또는 갱신될 때 이를 참조하는 외래키의 값을 유지할 것인지 또는 변경할 것인지 지정할 수 있다.
    • CASCADE : 기본키가 삭제되면 외래키도 삭제한다. ON DELETE 연산에 대해서만 지원된다.
    • RESTRICT : 기본키 값이 삭제되거나 업데이트되지 않도록 제한한다. 삭제 또는 업데이트를 시도하는 트랜잭션은 롤백된다.
    • SET NULL : 기본키가 삭제되거나 업데이트되면, 이를 참조하는 외래키 컬럼 값을 NULL로 업데이트한다.
    • NO ACTION : RESTRICT 옵션과 동일하게 동작한다.
예제

--creaing two tables where one is referencing the other

CREATE TABLE a_tbl(

id INT NOT NULL DEFAULT 0 PRIMARY KEY,

phone VARCHAR(10));

 

CREATE TABLE b_tbl(

ID INT NOT NULL,

name VARCHAR(10) NOT NULL,

CONSTRAINT pk_id PRIMARY KEY(id),

CONSTRAINT fk_id FOREIGN KEY(id) REFERENCES a_tbl(id)

ON DELETE CASCADE ON UPDATE RESTRICT);

 

INSERT INTO a_tbl VALUES(1,'111-1111'), (2,'222-2222'), (3, '333-3333');

INSERT INTO b_tbl VALUES(1,'George'),(2,'Laura'),(3,'Max');

SELECT a.id, b.id, a.phone, b.name FROM a_tbl a, b_tbl b WHERE a.id=b.id;

 

           id           id                   phone                 name

==============================================================================

            1            1                   '111-1111'            'George'

            2            2                   '222-2222'            'Laura'

            3            3                   '333-3333'            'Max'

 

--when deleting primay key value, it cascades foreign key value  

DELETE FROM a_tbl WHERE id=3;

 

1 rows affected.

 

SELECT a.id, b.id, a.phone, b.name FROM a_tbl a, b_tbl b WHERE a.id=b.id;

 

           id           id                   phone                 name

==============================================================================

            1            1                   '111-1111'            'George'

            2            2                   '222-2222'            'Laura'

 

--when attempting to update primay key value, it restricts the operation

UPDATE  a_tbl SET id = 10 WHERE phone = '111-1111';

 

In the command from line 1,

 

ERROR: Update/Delete operations are restricted by the foreign key 'fk_id'.

 

0 command(s) successfully processed.

주의 사항
  • 참조 제약 조건에는 참조 대상이 되는 기본키 테이블의 이름 및 기본키와 일치하는 컬럼명들이 정의된다. 만약, 컬럼명 목록을 지정하지 않을 경우에는 기본키 테이블의 기본키가 원래 지정된 순서대로 지정된다.
  • 참조 제약 조건의 기본키의 개수는 외래키의 개수와 동일해야 한다. 참조 제약 조건의 기본키는 동일한 컬럼명이 중복될 수 없다.
  • 참조 제약 조건에 의해 CASCADE되는 작업은 트리거의 동작을 활성화하지 않는다.
  • CUBRID HA 환경에서는 referential_triggered_action을 사용하지 않는 것을 권장한다. CUBRID HA 환경에서는 트리거를 지원하지 않으므로, referential_triggered_action을 사용하면 마스터 데이터베이스와 슬레이브 데이터베이스의 데이터가 일치하지 않을 수 있다. 자세한 내용은 CUBRID HA를 참고한다.
KEY 또는 INDEX
설명

KEYINDEX는 동일하며, 해당 컬럼을 키로 하는 인덱스를 생성한다. 인덱스 이름을 지정할 수 있으며, 생략하면 자동 부여된다.

예제

CREATE TABLE const_tbl3(id INT, phone VARCHAR, INDEX(id DESC, phone ASC));

 

CREATE TABLE const_tbl4(id INT, phone VARCHAR, KEY i_key(id DESC, phone ASC));