database.sarang.net
UserID
Passwd
Database
ㆍDBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DBMS Tutorials 140 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 140
DB 테이블 디자인에 도전하기 (5)
작성자
정재익(advance)
작성일
2001-12-07 13:50
조회수
5,672

열에서 CHECK 제약 조건 설정하기

 

각 열에서 유효한 값을 확인하고 열에 있는 데이터의 무결성을 강제 적용하는 방법을 지난 PRIMARY KEY 제약 조건에 이어 테이블 열에서 FOREIGN KEY를 설정하는 경우까지 알아 보았다.

이번 기사에서는 제약 조건에 맞는 무결한 데이터만을 입력받는 CHECK 제약 조건을 적용하는 방법에 대해서 이야기 해보자.

 

어떤 경우에 CHECK 제약 조건을 사용하는가?

 

예를 들어, "연봉관리" 테이블에 "급여"라는 열이 존재한다고 생각하자. 이 "급여" 열에는 항상 500,000원 부터 2000,000까지의 데이터만 입력되어야 한다면 CHECK 제약 조건을 만들어 값의 범위를 제한할 수 있다. 이렇게 하면 "급여" 열에 급여범위를 벗어나는 값이 입력되었을 때에는 에러를 발생시켜 데이터의 무결성을 유지할 수 있다.

가끔 에러 나는게 더 안좋지 않느냐는 이야기를 하는 경우도 있지만 데이터의 무결성이 깨져 잘못 입력된 데이터가 어떤 결과를 초래하는지 경험을 한다면 이런 이야기는 나오지 않는다.

 

논리 연산자에 따라 TRUE 또는 FALSE를 반환하는 논리(부울) 식을 사용하여 CHECK 제약 조건을 만들 수 있다. 예제에 대한 논리 식은 다음과 같다.

 

급여 >= 500000 AND 급여 <= 2000000

 

CHECK 제약 조건은 다음이 가능하다.

    . 한 열에서 여러 CHECK 제약 조건을 적용할 수 있다. 
    . 이 제약 조건은 만들어진 순서대로 평가된다. 
    . 테이블 수준에서 CHECK 제약 조건을 만들어 CHECK 제약 조건을 여러 
     열에 적용할 수도 있다. 
    . 예를 들어, 여러 열에 대한 CHECK 제약 조건을 사용하여 미국이란 
      country 열 값을 가진 모든 행이 state 열에서 두 문자의 값을 갖도록 
      할 수 있다. 
    . 테이블을 만들 때 테이블 정의의 일부로 만들어진다.
    . 기존 제약 조건이 수정되거나 삭제된다. 예를 들어, 테이블의 열에서 CHECK 
       제약 조건이 사용하는 식을 수정할 수 있다. 
    . Transact-SQL 또는 SQL-DMO를 사용하여 CHECK 제약 조건을 수정하려면 
      먼저 기존 CHECK 제약 조건을 삭제하고 새 정의를 사용하여 다시 만들어야 
      한다. 

기존 테이블에 추가한 CHECK 제약 조건이 새 데이터에만 적용되거나 새 데이터와 기존 데이터에 모두 적용되게 할 수 있습니다. 기본적으로 CHECK 제약 조건은 새 데이터와 기존 데이터에 모두 적용됩니다. 새 데이터에만 이 제약 조건을 적용하는 옵션은 기존 데이터가 이미 새 CHECK 제약 조건을 만족하거나 업무 규칙이 앞으로만 새 제약 조건을 적용하려 할 때 유용합니다.

 

예를 들어, 기존 제약 조건에서는 우편 번호를 5자리로 제한하지만 새 제약 조건은 9자리 우편 번호를 필요로 할 수 있습니다. 기존의 5자리 우편 번호는 아직도 유효하며 9자리 우편 번호가 있는 새 데이터와 함께 존재하게 됩니다. 이런 경우는 새 제약 조건이 새 데이터에만 적용되도록 해야 합니다.

 

그러나 기존 데이터를 검사하지 않고 제약 조건을 추가할 때는 Microsoft® SQL Server™ 2000이 테이블의 무결성 규칙을 수행하지 않으므로 주의해야 합니다.

 

기존의 테이블 열에 새로운 Check 제약 조건을 첨부하려면

     . 데이터베이스 다이어그램을 이용할 경우 제약 조건을 포함할 테이블을 마우스 
       오른쪽 단추로 클릭한 다음 바로 가기 메뉴에서 제약 조건을 선택한다. 테이블 
       디자이너를 이용할 경우 제약 조건을 포함할 테이블에 대해 테이블 디자이너를 
       열고, 테이블 디자이너를 마우스 오른쪽 단추로 클릭한 다음 바로 가기 메뉴에서 
       제약 조건을 선택한다. 
    . 새로 만들기를 선택한다. 선택한 제약 조건 상자에 새로운 제약 조건의 시스템 
      할당 이름이 표시된다. 시스템 할당 이름은 "CK_"로 시작되며 뒤에 테이블 
      이름이 붙는다.
    . 제약 조건 식 상자에 Check 제약 조건에 대한 SQL 식을 입력한다. 예를 들어 
      authors 테이블의 state 열 항목을 New York으로 제한하려면 아래와 같이 
      입력한다. 
    . state = 'NY' 
    . 또는 zip 열 항목을 다섯 자리 숫자로 제한하려면 아래와 같이 입력한다. 
    . zip LIKE '[0-9][0-9][0-9][0-9][0-9]' 
    . 참고   숫자가 아닌 제약 조건 값은 작은따옴표(')로 둘러싸야 한다. 
    . 제약 조건 이름을 변경하려면 제약 조건 이름 상자에 이름을 입력한다.
    . 확인란을 사용하여 제약 조건이 적용되는 시점을 제어한다. 
        . 제약 조건을 만들기 전에 기존 데이터에서 제약 조건을 테스트하려면 
          작성할 때 기존 데이터 검사를 선택한다. 
        . 이 테이블에서 복제 작업이 발생할 때마다 제약 조건을 적용하려면 복제에 
          대해 제약 조건 적용을 선택한다. 
        . 이 테이블의 행이 삽입되거나 업데이트될 때마다 제약 조건을 적용하려면 
          INSERT 및 UPDATE에 대해 제약 조건 적용을 선택한다. 

[그림] "BirthDate" 열에 현재 날짜보다 이전의 값이 들어오게 하는 Check 제약 조건 예

 

 

열에서 DEFAULT 정의 설정하기

 

각 열에서 유효한 값을 확인하고 열에 있는 데이터의 무결성을 강제 적용하는 방법을 CHECK 제약 조건을 적용하는 방법까지 알아 보았다.

이번 기사는 마지막으로 DEFAULT 정의를 통한 데이터 무결성 작업에 대해 알아 보자.

 

어떤 경우에 DEFAULT 정의를 사용하는가?

 

예를 들어 테이블에 "입력일"이라는 열이 존재한다고 생각하자. 이 "입력일" 열에는 항상 '2001-06-10' 이라는 값이 입력된다면 보통 date, now 함수 등을 통해 날짜를 잡은후 입력시킬 수 있다.

하지만 이런 경우는 DEFAULT 정의를 통해 "입력일"이라는 열에 getdate() 라고 정의하게 되면 자동으로 데이터가 입력될 때마다 "입력일" 열에는 원하는 값이 들어가게 된다.

 

레코드의 각 열은 값을 가져야 한다. 값이 NULL일 수도 있다. 데이터 행을 테이블로 로드해야 하는데 열의 값을 모르거나 값이 아직 없는 경우가 있다. 열에서 Null 값을 허용하면 행을 Null 값으로 로드할 수 있다. 그러나 Null을 허용하는 열을 사용하지 않는 것이 바람직하므로 가능하다면 열에 DEFAULT 정의를 정의하는 것이 더 좋은 해결책이다. 예를 들어, 숫자 열에는 0을 기본값으로 지정하고 값이 지정되지 않았을 때 문자열 열에는 원하는 기본값으로 지정하는 것이 일반적이다.

 

Null 값 허용에 대한 이해

 

열의 Null 허용 여부는 테이블의 행에서 특정 열에 Null 값을 포함할 수 있는지 여부를 결정한다. Null 값 또는 NULL은 0, 공백 또는 ""와 같은 빈 문자열과 다르다. NULL은 아무 값도 입력하지 않았다는 뜻이다. Null이 있으면 대개 값이 알려지지 않거나 정의되지 않았다는 것을 나타낸다. 예를 들어, pubs 데이터베이스에 있는 titles 테이블의 price 열의 Null 값은 책에 값이 없다는 의미가 아니다. 이 때 NULL은 값이 알려지지 않거나 설정되지 않았다는 뜻이다. 일반적으로 Null 값이 있으면 쿼리 및 업데이트가 복잡해지며 PRIMARY KEY 제약 조건처럼 Null 허용 열과 함께 사용될 수 없는 열 옵션이 있기 때문에 Null 값을 허용하는 것은 피해야 한다.

 

행을 삽입했는 데 Null 값을 허용하는 열에 아무 값도 입력되지 않으면 DEFAULT 정의 또는 개체가 존재하지 않을 때 SQL Server가 NULL 값을 제공한다. NULL 키워드로 정의된 열도 데이터 형식과 연결된 기본값이 있는지 여부에 상관 없이 사용자로부터 명시적으로 NULL 입력을 받는다. NULL을 인용 부호 안에 넣을 수 없다. 인용 부호 안에 넣으면 Null 값이 아니라 문자열 'NULL'로 해석된다.

 

열에서 Null 값을 허용하지 않도록 하면 열에 항상 데이터가 있기 때문에 데이터 무결성을 유지할 수 있다. Null 값이 허용되지 않으면 테이블에 데이터를 입력하는 사용자가 열에 값을 입력해야 한다. 그렇지 않으면 테이블 열을 데이터베이스로 가져올 수 없다.

 

열에서 Null을 허용하지 않고 DEFAULT 정의도 없으면 열에 명시적으로 값을 지정해야 한다. 그렇지 않으면 SQL Server가 열에서 Null 값을 허용하지 않는다는 오류를 반환한다.

 

DEFAULT 정의, 열의 Null 허용 여부, 열에 삽입되는 값의 조합으로 정의된 열에 삽입되는 값은 다음과 같다.

열 정의                입력 안함,                입력안함,             NULL 값 입력
                          DEFAULT 정의 없음  DEFAULT 정의
 
Null 값 허용         NULL                       기본값                    NULL 
Null 값 허용 안함  오류                         기본값                    오류 

DEFAULT 정의는 다음이 가능하다.

    . 테이블을 만들 때 테이블 정의의 일부로 만들어진다. 
    . 기존 테이블에 추가된다. 테이블의 각 열은 하나의 DEFAULT 정의를 가질 
      수 있다. 
    . 기본값은 DEFAULT 정의가 적용되는 열의 데이터 형식과 같아야 한다. 예를 
      들어, int 열의 기본값은 문자열이 아니라 정수여야 한다. 
    . 테이블의 기존 열에 DEFAULT 정의가 추가될 때 SQL Server는 기본적으로 
      테이블에 추가된 새 데이터 행에만 새 기본값을 적용한다. 이전의 DEFAULT 
      정의를 사용하여 삽입된 기존 데이터에는 적용되지 않는다. 기존 테이블에 새 
      열을 추가할 때는 SQL Server가 기존 행의 새 열에 Null 값 대신 DEFAULT 
      정의에서 지정된 기본값을 삽입하도록 할 수 있다. 
    . DEFAULT 정의를 삭제할 때는 새 행의 열에 아무 값도 입력되지 않으면 
      SQL Server가 기본값 대신 Null값을 삽입한다. 이 때 테이블의 기존 데이터는 
      변경되지 않는다. 
    . DEFAULT 정의는 다음이 정의된 열에서 만들 수 없다. 
          . timestamp 데이터 형식 
          . IDENTITY 또는 ROWGUIDCOL 속성 
          . 기존 DEFAULT 정의 또는DEFAULT 개체 

 

DEFAULT 개체를 만들려면

    . 서버 그룹을 확장한 다음 서버를 확장한다.
    . 데이터베이스를 확장한 다음 DEFAULT 개체를 만들 데이터베이스를 확장한다.
    . 기본값을 마우스 오른쪽 단추로 클릭한 다음 새 기본값을 클릭한다.
    . 이름에 DEFAULT 개체의 이름을 입력한다.
    . 값에 DEFAULT 개체의 값을 입력한다. 이 값은 상수, 식 또는 변수가 될 수 
      있다.
    . 예를 들어 날짜를 입력받고 싶다면 getdate() 라고 입력한다. 
    . 테이블 디자인을 저장한다.
	
[Top]
No.
제목
작성자
작성일
조회
174DW 데이터 변환
정재익
2001-12-14
6042
173DataWarehouse 란 무엇인가? [1]
정재익
2001-12-14
5369
155예약어와 중복되는 이름을 이용할려면
정재익
2001-12-09
9348
140DB 테이블 디자인에 도전하기 (5)
정재익
2001-12-07
5672
139DB 테이블 디자인에 도전하기 (4)
정재익
2001-12-07
5165
138DB 테이블 디자인에 도전하기 (3)
정재익
2001-12-07
9079
137DB 테이블 디자인에 도전하기 (2)
정재익
2001-12-07
6374
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다