IT/DB

[DB] 데이터베이스 제약조건과 PK, FK

코딩하는 너구리 2022. 10. 5. 18:26
반응형

 

개발하면서 다양한 RDB를 사용하게 되는데, 이번 글에서는 데이터베이스 제약조건과 함께 PK, FK 특징에 대해 정리해볼까 합니다.

 

 

 

먼저 Constraint란 뜻에 대해 찾아보았는데요.

제약의 뜻을 가지고 있었습니다.

 

그렇다면 데이터베이스에서 말하는 제약조건이란 무엇일까요?

 

 

제약조건

제약 조건(constraint)이란 데이터의 무결성을 지키기 위해, 데이터를 입력받을 때 실행되는 검사 규칙을 의미합니다.
이러한 제약 조건은 CREATE 문으로 테이블을 생성할 때나 ALTER 문으로 필드를 추가할 때도 설정할 수도 있습니다.

 

제약조건에는 어떤 종류가 있을까요? MySQL에서 사용할 수 있는 제약 조건은 다음과 같습니다.

  1. NOT NULL
  2. UNIQUE
  3. PRIMARY KEY
  4. FOREIGN KEY
  5. DEFAULT

NOT NULL부터 제약조건들을 하나씩 살펴보도록 하겠습니다.


NOT NULL

NOT NULL 제약 조건을 설정하면, 해당 필드는 NULL 값을 저장할 수 없습니다.
즉, 이 제약 조건이 설정된 필드는 무조건 데이터를 가지고 있어야 합니다.
NOT NULL 제약 조건은 CREATE 문으로 테이블을 생성할 때나, 나중에 ALTER 문으로 추가할 수도 있습니다.

 

CREATE 시 NOT NULL 설정

: CREATE 문으로 테이블을 생성할 때 해당 필드의 타입 뒤에 NOT NULL을 명시하면, 해당 필드는 NULL 값을 가질 수 없습니다.

CREATE TABLE Test
(
    ID INT NOT NULL,
    Name VARCHAR(30),
    ReserveDate DATE,
    RoomNum INT
);

위 쿼리처럼 ID 필드에 NOT NULL 제약조건을 설정하고 테이블을 생성한 뒤 테이블의 상세 정보를 확인하면 다음과 같습니다.

 

NOTNULL 적용 예시

이제부터 Test 테이블에서 INSERT 문으로 새로운 레코드를 추가할 때 ID 필드의 값으로 NULL을 사용할 수 없습니다.

NOT NULL 제약조건이란 해당 필드에 NULL 값을 저장할 수 없도록 설정하는 것으로, 해당 필드를 생략하지 못하도록 하는 제약조건은 아님을 기억해두길 바랍니다.

 

실제로 ID 필드가 생략된 경우에도 레코드 저장이 가능한데, SQL예시와 생성 결과는 아래와 같습니다.

INSERT INTO Test (Name, ReserveDate, RoomNum)
VALUES('이순신', '2016-02-16', 1108);

NOTNULL 생략 예시


UNIQUE

UNIQUE 제약 조건을 설정하면, 해당 필드는 서로 다른 값을 가져야 합니다.
즉, 이 제약 조건이 설정된 필드는 중복된 값을 저장할 수 없습니다.

 

UNIQUE 제약 조건은 CREATE 문으로 테이블을 생성할 때나, 나중에 ALTER 문으로 추가할 수도 있습니다.

 

1. CREATE TABLE 테이블이름
(
	필드명 필드타입 UNIQUE,
    ...
)

2. CREATE TABLE 테이블이름
(
	필드이름 필드타입,
    ...
    [CONSTRAINT 제약조건이름] UNIQUE (필드이름)
)

위의 두 문법 모두 해당 필드에 UNIQUE 제약조건을 설정합니다.

이때 두 번째 문법을 사용하면, 해당 제약 조건에 이름을 설정할 수 있습니다.

 

CREATE 시 Test 테이블을 생성하면서 ID 필드에 UNIQUE 제약조건을 설정하는 예시를 살펴보도록 하겠습니다.

 

CREATE TABLE Test 

(

    ID INT UNIQUE,

    Name VARCHAR(30),

    ReserveDate DATE,

    RoomNum INT

);

 

UNIQUE 예시

이렇게 ID 필드에 UNIQUE 제약조건을 설정한 후에 Test 테이블의 정보를 확인하면 다음과 같습니다.


PRIMARY KEY

PRIMARY KEY 제약 조건을 설정하면, 해당 필드는 NOT NULLUNIQUE 제약 조건의 특징을 모두 가집니다.
따라서 이 제약 조건이 설정된 필드는 NULL 값을 가질 수 없으며, 또한 중복된 값을 가져서도 안 됩니다.
이러한 PRIMARY KEY 제약 조건을 기본 키라고 합니다.
 
UNIQUE는 한 테이블의 여러 필드에 설정할 수 있지만, PRIMARY KEY는 테이블당 오직 하나만 설정할 수 있습니다.
이러한 PRIMARY KEY 제약 조건은 테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 합니다.

 

  • PRIMARY KEY테이블의 각 레코드를 고유하게 식별합니다.
  • 기본 키는 UNIQUE 값을 포함해야 하며 NULL 값을 포함할 수 없습니다.
  • 테이블에는 하나의 PK(기본키)만 있을 수 있습니다.

 

CREATE시 PRIMARY KEY 제약조건을 설정하는 문법을 보도록 하겠습니다.

해당 필드의 타입 뒤에 PRIMARY KEY를 명시하면, 해당 필드가 기본 키로 설정됩니다. 

1. CREATE TABLE 테이블이름

(

    필드이름 필드타입 PRIMARY KEY,

    ...

)
2. CREATE TABLE 테이블이름

(

    필드이름 필드타입,

    ...,

    [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

)

위의 두 문법 모두 해당 필드에 PK를 설정합니다.

이 때 두 번째 문법을 사용하면 해당 조건에 이름을 설정할 수 있습니다.

 

실제 쿼리와 생성된 테이블을 살펴보면 다음과 같습니다.

CREATE TABLE Test 

(

    ID INT PRIMARY KEY,

    Name VARCHAR(30),

    ReserveDate DATE,

    RoomNum INT

);

PK 예시


FOREIGN KEY

FOREIGN KEY 제약 조건을 설정한 필드는 외래 키라고 부르며, 한 테이블을 다른 테이블과 연결해주는 역할을 합니다.
외래 키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조해서 레코드가 입력됩니다.
즉, FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만듭니다.
 
FOREIGN KEY 제약 조건을 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 합니다.

 

CREATE시 FORIGN KEY를 설정하는 문법을 살펴보겠습니다.

테이블을 생성할 때 해당 필드의 타입 뒤에 FOREIGN KEY를 명시하면, 해당 필드가 외래 키로 설정됩니다.

CREATE TABLE 테이블이름

(

    필드이름 필드타입,

    ...,

    [CONSTRAINT 제약조건이름]

    FOREIGN KEY (필드이름)

    REFERENCES 테이블이름 (필드이름)

)

참조되는 테이블의 이름은 REFERENCES 키워드 다음에 명시합니다.

 

Test2 테이블의 ParentID 필드에 Test1 테이블의 ID 필드를 참조하는 FOREIGN KEY 제약 조건을 설정하는 예시를 살펴보겠습니다.

CREATE TABLE Test2

(

    ID INT,

    ParentID INT,

    FOREIGN KEY (ParentID)

    REFERENCES Test1(ID) ON UPDATE CASCADE

);

 

FK 예시

 

ON DELETE, ON UPDATE

FOREIGN KEY 제약 조건에 의해 참조되는 테이블에서 데이터의 수정이나 삭제가 발생하면, 참조하고 있는 테이블의 데이터도 같이 영향을 받습니다.
이때 참조하고 있는 테이블의 동작은 다음 키워드를 사용하여 FOREIGN KEY 제약 조건에서 미리 설정할 수 있습니다.

참조되는 테이블의 값이 삭제될 경우의 동작은 ON DELETE 구문으로 설정할 수 있습니다.
또한, 참조되는 테이블의 값이 수정될 경우의 동작은 ON UPDATE 구문으로 설정할 수 있습니다.

이때 설정할 수 있는 동작은 다음과 같습니다.

 

1. CASCADE : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블에서도 삭제와 수정이 같이 이루어집니다.

2. SET NULL : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 NULL로 변경됩니다.

3. NO ACTION : 참조되는 테이블에서 데이터를 삭제하거나 수정해도, 참조하는 테이블의 데이터는 변경되지 않습니다.

4. SET DEFAULT : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 필드의 기본값으로 설정됩니다.

5. RESTRICT : 참조하는 테이블에 데이터가 남아 있으면, 참조되는 테이블의 데이터를 삭제하거나 수정할 수 없습니다.


DEFAULT

DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 해줍니다.
만약 레코드를 입력할 때 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본값을 저장합니다.

 

CREATE 시 Test 테이블을 생성하면서 Name 필드에 DEFAULT 제약조건을 이용하여 기본값을 설정하는 예시를 살펴보겠습니다.

CREATE TABLE Test

(

    ID INT,

    Name VARCHAR(30) DEFAULT 'Anonymous',

    ReserveDate DATE,

    RoomNum INT

);

위 쿼리의 결과로 생성된 테이블의 상세 정보는 아래와 같습니다.


 

NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, DEFAULT 와 같은 다양한 데이터베이스 제약조건에 대해 살펴보았습니다.

또 PK와 FK 설정시의 제약조건에 대해 알아보았습니다.

 

RDB를 이용해서 서비스를 구현할 때 기본이 되는 내용이므로

꼭 숙지하여 DB를 설계하고 사용하는 것이 좋을 것 같습니다.

 

 

 

참고: http://tcpschool.com

반응형

'IT > DB' 카테고리의 다른 글

[DB] 데이터베이스 트랜잭션의 4가지 특징(ACID)  (0) 2022.10.06